• ベストアンサー

smbclientの戻り値を取得

お世話になります。perlプログラムからshellを呼び出して shellでsmbclientを呼び出すのですが、smbclientの戻り値を 受け取るにはどうしたらよいでしょうか? test1.pl $re = system "sh test1.sh"; test.sh smbclient //host/dir -U user%passwd put ... put ... exit イメージはこんな感じです。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

> エラー:256がかえりました。 ほうほう、なるほどね。 これは恐らくC言語と同じ仕様なのだと思うね。GNUのLIBCにおいて、system()関数の戻り値は、上位バイトにこのリターンコードが入っている。つまり、シェルスクリプトが通常終了し、smbclientが1を返す→シェルスクリプトが1を返すと、Perlのsystem関数の戻り値は、上位バイトが1、下位バイトが0で256になるんだろうね。 実際、C言語では上位バイトを取るという話ではなく、論理的なマクロを使うのだが、現行のシステムでは単純に8ビット右にシフトまたは256で割った商で良い。 test1.pl system "sh test1.sh"; print $?; ←ここで$?の値を右に8ビットシフトしてあげると良い 当方、実はPerlはほとんど分からないので、シフトの方法は頑張ってちゃぶだい。

geso775
質問者

お礼

anmochi様、有難う御座います。 丁寧な回答で大変よくわかりました。 perl内で$?取得した値が、上位ビットでありながらsmbclientの戻り値を返していることが わかりました。 sh内の$?を出力して、perlで読み込むような術は避けたかったのでとても助かりました。 又よろしくお願い致します。

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

ふみゅ? perlからシェルスクリプトを呼び出すのね? すると、この問題は「シェルスクリプトで直前コマンドの返り値を取得する方法」となるよね。 bashのシェルスクリプトでは、直前のコマンドの返り値は$?というシェル変数でアクセスできる。 smbclient hogehoge gehogeho echo $? 後は、この$?を何かに保存すれば良い。

geso775
質問者

補足

ご回答有難うございます。 希望の戻り値を取得する事が出来ました!が、perlに戻り値を渡せないでいます。 test1.pl system "sh test1.sh"; print $?; とすると、正常:0、エラー:256がかえりました。 test.sh smbclient //host/dir -U user%passwd put ... echo $? 同様に、とすると、正常:0、エラー:1がかえりました。 >bashのシェルスクリプトでは、直前のコマンドの返り値は$? perlでも同じ意味だったので、やってみたのですが こんな横着はできないのでしょうか・・

関連するQ&A

  • 実行結果を戻り値で取得したい

    MS-DOSバッチの実行結果を文字列で取得したいです。 イメージ例としては、下記のようなバッチ2つがあり、 バッチAを起動します。そうすると実行結果の戻り値として 「TEST」という文字列が取得できたら良いです。  ※下記例では「ERRORLEVEL」に入っているようなイメージです。 しかしながら、ERRORLELVEに格納できるのは数値のみの為、 エラーになってしまいます。 どうすれば、実行結果を戻り値で取得できるでしょうか? お手数ですが、MS-DOSで不可能な場合、VBScriptやWSHでも かまいませんので、処理をキックしてその戻り値を文字列で取得する方法を お教えください。お願いいたします。 -------------------------------- 例 【バッチA】 call バッチB echo %ERRORLEVEL% 【バッチB】 exit /b "TEST" -------------------------------- と実行し

  • ttlで戻り値を取得する方法

    Teratermmacroでローカル(cygwin)に入り、サーバ(HP-UX)にリモートで入った後、 コマンドの戻り値で後の行動を操作したいのですが、うまくいきません。 わかる方、教えていただけませんか。 ざっくり以下のようなマクロを組んでいます。 ---------------------------------------------------------- sendln 'ssh name@host1' wait Prompt sendln 'sendmsg "test"'(のようなコマンド) ←これの戻り値がほしい if 戻り値 = 0 then  ○○ elseif 戻り値 = 1 then  wait Prompt  sendln 'exit'  wait Prompt  sendln 'ssh name2@host2' 以下略 ---------------------------------------------------------- 上記の「戻り値」をどのようにすれば戻り値で判別してくれるでしょうか。 if文の条件式を $?やresultでやりましたが、どのような戻り値でも 必ず$?は0、resultは1で固定でした。 また、sendmsgとif文の間に以下のように試しましたが、失敗しました。 例1: ---------------------------------------------------------- sendln 'echo $?' recvln if inputstr = 0 then ←syntax errorになります。  ○○ elseif inputstr = 1 then ---------------------------------------------------------- 例2:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1247390747参照 ---------------------------------------------------------- sendln 'echo $?' recvln recvln hensu=inputstr ←Type mismatch.のエラーになる。 直前にstr2intを入れたりしても駄目でした。 ちなみにsendln 'echo $?'を挟まずsendmsgの直後にrecvlnでも駄目です。 if hensu = 0 then  ○○ elseif hensu = 1 then ---------------------------------------------------------- host1にシェルスクリプトを入れることは出来ません。

  • shellでsmbclientでファイル転送

    お世話になります。 smbclientを使ってlinux->windowsへとファイルを転送しようとしています。 手動では smbclient //windows_client/d -U administrator% smb: \>put text1.txt smb: \>exit これをシェルスクリプトにしたいのですが、smbに文字を渡すにはどうしたら よいのでしょうか?お願いいたします。

  • scpをスクリプト内で実行してそれにpasswordを渡したい

    scpをスクリプト内で実行して,それにpasswordを渡すようなことをshellスクリプト又はPerlスクリプトで出来ますでしょうか? (私の調べたところ)scpはオプションでpasswordを渡すことがどうやら出来ないようなので, プロンプトが入力待ちになったときにそこにpasswordを流すようなことを実現したいのです. 因に, #!/bin/sh scp test.txt host.hogehoge.ne.jp:~ echo "passwd"; ではパスワード入力の所で止まって仕舞います. スクリプトに生にpasswordを記述するのはセキュリティ上マズイとはおもいますが,この問題はとりあえず別問題として下さい. よろしくお願いします.

  • activeperlでDBD-Pgを扱うと、perlが強制終了する

    まず環境です。 -----[os環境]---------------- windows xp sp2 -----[active perlバージョン]- This is perl, v5.8.7 built for MSWin32-x86-multi-thread -----[cpan環境]-------------- ppm> properties DBI ppm> properties DBD-Pg で結果表示あり(インストール済みと判断) -----[PostgreSQLの環境]------ psql -U postgres -h localhost bookmark ユーザ postgres のパスワード:postgres ログイン可能でDB環境正常と判断。 の環境で、以下のスクリプトを実行すると、perlが強制終了します。 ------[test.pl]-------- #! /usr/bin/perl use DBI; $dbname = "worple"; $user = "postgres"; $passwd = "postgres"; $host = "localhost"; #DBオープン $db = DBI->connect("DBI:Pg:host=$host;dbname=$dbname", $user, $passwd) || die "DBI connect failed : $DBI::errstr"; #DBクローズ $db->disconnect; 1; ---------------- エラーメッセージがでることもなく、googleでも似た症状を探せないでいます。 何かヒントや、参考のURLでもいいのでお教え下さい。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • パスワードなので、●●●●●と表示したい

    こんにちは。Perlを勉強中です。ご回答よろしくお願いいたします。 test.plを作成しました。 実行方法は、引数(userid)をつけて実行します。 perl test.pl userid すると、パスワードをきいてきて、 passwd:●●●●●  入力した文字が $passwdに格納され、表示は●で表示されるようにしたいのですがどうしたらよいでしょうか? なお、引数(userid)の部分は、$userid = shift @ARGV; を使っています。 $useridと$passwdで認証をしたいと思っています。 どうぞよろしくお願いいたします。

  • bashでの変数の引渡し方法

    bashを使用するのが初めてなので教えてください。 shellscriptの中で変数を設定するのに共通変数設定用の子Shellを実行して変数を設定したいと思っていますが、うまく動きません。どのように設定したらいいのでしょうか。cshのときはsetenvでよかったのですが。。 親shell(hoge.sh) -------------- #!/bin/sh ./setenv.sh #変数設定用子Shell echo $USER exit 0 -------------- 子Shell(setenv.sh) -------------- #!/bin/sh USER="hoge" exit 0 -------------- 実行すると以下のようになります。 $./hoge.sh USER: not found

  • VBAでバッチ実行ができません

    手動では動くバッチファイルがマクロからだと動きません。 何か必要なコマンドがあるのでしょうか? よろしくお願いします。 VBA--------- Shell "C:\test.bat", vbNormalFocus test.bat--------- perl a.pl b.log c.log d.log > e.csv exit OSがXP、Excelが2003です。

  • perl リモートでコマンド実行結果取得

    perl 初心者です。 Perlでリモートログイン後grep結果を取得する方法で分からないことがあり質問しました。 rootユーザで実行するPPP.plスクリプト内で、他のサーバにsshでログイン後grepの結果を取得しようと考えていますが、rootユーザでPPP.plを実行しスクリプト内でsshを実行するとパスワードを聞かれてしまいます。 そこで、他のユーザAAAでPPP.plを実行し、sshを実行するとパスワードは聞かれない設定になっているそうです。(詳細は分かりませんが) そこで、実現方法について下記のように考えていますが、他の方法、sshのオプション等他の考えが、あれば教えてください。確認する環境がなくて実行していませんのであっているかも分かりません。 PPP.pl実行サーバ:server1 ssh先のサーバ:server2 PPP.plの実行ユーザ:ROOT パスワードが聞かれないserver1のユーザ:AAA server2のログインユーザ:AAA ※PPP.plの実行ユーザはrootから変更はできません --------------------------------------- #ユーザAAAに変更 system("su - AAA"); #server2のgrep結果取得 my @rtn_grep = `ssh -l AAA server2 grep test /var/log/msg.log`; if($? != 0){ exit; } ## grep結果を参照 XXXX #rootユーザに戻る system("exit"); -------------------------------- 以上です。宜しくお願い致します。

    • ベストアンサー
    • Perl
  • ストアドの戻り値(配列)について

    ストアドをコールして配列型の戻り値を取得したいのですが、 エラーが出てしまい原因が分かりません。 どなたかご教授頂けないでしょうか? ★PL/SQL★ CREATE OR REPLACE TYPE TBL_NUM10 AS VARRAY(10) OF NUMBER(10); CREATE OR REPLACE PACKAGE TEST_PKG IS TYPE TBL_NUM10 IS VARRAY(10) OF NUMBER(10); PROCEDURE HAIRETU(O_CNT OUT TBL_NUM10); END TEST_PKG; / CREATE OR REPLACE PACKAGE BODY TEST_PKG IS PROCEDURE HAIRETU(O_CNT OUT TBL_NUM10) IS TMP_CNT TBL_NUM10; BEGIN TMP_CNT := TBL_NUM10(0,0,0,0,0,0,0,0,0,0); TMP_CNT(1) := 1; TMP_CNT(2) := 2; TMP_CNT(3) := 3; O_CNT := TMP_CNT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END HAIRETU; END TEST_PKG; / DECLARE O_CNT TBL_NUM10; BEGIN TEST_PKG.HAIRETU(O_CNT); DBMS_OUTPUT.PUT_LINE(O_CNT(1)); DBMS_OUTPUT.PUT_LINE(O_CNT(2)); DBMS_OUTPUT.PUT_LINE(O_CNT(3)); END; / ★実行結果★ SQL実行中に以下のエラーが発生しました。 ORA-06550: 行4、列4: PLS-00306: 'HAIRETU'の呼出しで、引数の数または型が正しくありません。 ORA-06550: 行4、列4: PL/SQL: Statement ignored よろしくお願いします。