なにか良い方法ないでしょうか。
Net::SSH::ExpectやNet::Expectも試したですが、実行結果出力が乱れてしまいやりたいこと(複数ホストにちらばるスクリプトの調査)ができなくなってしまうので左記モジュールは避けたいです。Expectコマンドも同様の理由で避けたいです。
また、/etc/sudoersを勝手に編集することができないためパスワード無しでスイッチするなどの方法も使えないです。
Net::SSH::Perlでやりたいです。おねがいします。すごいひと。
ちなみに以下がそのコードです。@cmdlistにコマンドが入ってます。
$OUTFILEに実行結果をロギングしています。
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
my $ssh = Net::SSH::Perl->new($host,debug => 1);
$ssh->login($user, $pass);
for my $cmd (@cmdlist){
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
print $OUTFILE $stdout;
}
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
できない
スクリプトにsudoのパスワードを埋め込むなどナンセンス
そうですか、ご回答ありがとうございました。
ただ、自宅LAN内に閉じた仮想環境上に存在する機器で兄弟で使いまわしてるだけの環境なので
あまりセキュリティにはこだわってないのです。勝手に編集できないのは私のつくった環境じゃないからです。
確認とればたぶん編集できるのですがせっかくNet::SSH::Perl入れたのでこのモジュールで解決策はないのかなあと。
そもそもNet::SSH::Perlではsudoすることができないのですかね。
複数のホストにssh経由でroot権限で同一コマンドを発行したいというのがやりたいことでそれに対する解決策て無いのですかね?
「-S」オプションを指定すれば、パスワードを標準入力から読み込むようになります。
また、/etc/sudoersを勝手に編集することができないためパスワード無しでスイッチするなどの方法も使えないです。
ちょっと気になったのですが、ssh で繋がった時のユーザは、既に /etc/sudoers でシェルの実行が許可されている、ということで良いでしょうか?
そもそも、/etc/sudoers で許可されていないと、sudo を使って root 権限での実行は出来ません。
su であれば、root のパスワードを指定する(sudo の場合、指定するパスワードは自分自身のパスワード)することで、root 権限でのプログラムの実行が可能ですが、こっちは標準入力は使えないようです。
あと、-S を使った場合、sudo にとっての標準入力が閉じてしまえば、sudo も終了します。例えば、
$ echo 'password' | sudo -s -S
とすれば、echo が 'password' を渡してしまうと、sudo の標準入力は閉じられるので、一見、何も無かったように、元のプロンプトが帰ってきてしまいます。これを、
$ echo -e 'password\ncat /etc/shadow' | sudo -s -S
とすれば、root でシェルが起動され「cat /etc/shadow」が実行され、その結果が標準出力に出力されたあと、sudo の処理が終わって元に戻るのが分かると思います。
また、1度、sudo による認証に成功すると、デフォルトで5分間はパスワード入力が不要になります。ですので、闇雲に標準入力にパスワードを送っても、そもそもパスワードを要求しない場合には、そのパスワード文字列が sudo で起動されたプログラムへの標準入力となってしまいますので、注意が必要です。
ご回答ありがとうございます。
> /etc/sudoers でシェルの実行が許可されている
はい、シェルの実行が許可されているユーザで作業してます。
sudoersにNOPASSWD:を付与するなどは家族に確認を取らないとできないという意味でした。
sudoは標準入力からもパスワードを受け取ることができるのですね。とりあえず以下のようにスイッチしました。
$ echo 'password' | sudo -s -S $ sudo -s
上記の方法でうまくスイッチすることができました。
パスワードキャッシュ中にパスワードを再送してしまった場合、そんなコマンドは知らないと怒られてしまいますが
それは無視しようと思います。
ありがとうございました!!
追記:
とおもいきやNet::SSH::Perlで実行してみるとやはり途中で停止してしまいました。
デバッグログを見ると以下のログを出力して停止してしまいます。
myhostname: channel 2: open confirm rwindow 0 rmax 32768
うーん、パスワードプロンプトが原因と思ったのですが違うのかもしれないですね。。。
さらに追記:
@cmdlistにbashといれてみたら同じdebugログ箇所でだんまりになりました。
どうやらNet::SSH::Perlからshellを生成すると発生する問題のようです。
ご回答ありがとうございました。