Net::SSH::Perlをつかってrootにスイッチユーザしたいです。ホストに接続し一般ユーザでコマンド発行はできるのですがsudo -sしたあとPasswordプロンプトを受け取ったまま止まってしまいます。

なにか良い方法ないでしょうか。
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;
}
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/07/13 01:45:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kick_m No.1

回答回数1372ベストアンサー獲得回数54

ポイント27pt

権限のない人はsudoは使えない。http://www

id:umiyosh

ご回答ありがとうございました。

2010/07/06 11:00:44
id:koriki-WeKan No.2

回答回数342ベストアンサー獲得回数20

ポイント27pt

できない


スクリプトにsudoのパスワードを埋め込むなどナンセンス

id:umiyosh

そうですか、ご回答ありがとうございました。

ただ、自宅LAN内に閉じた仮想環境上に存在する機器で兄弟で使いまわしてるだけの環境なので

あまりセキュリティにはこだわってないのです。勝手に編集できないのは私のつくった環境じゃないからです。

確認とればたぶん編集できるのですがせっかくNet::SSH::Perl入れたのでこのモジュールで解決策はないのかなあと。

そもそもNet::SSH::Perlではsudoすることができないのですかね。

複数のホストにssh経由でroot権限で同一コマンドを発行したいというのがやりたいことでそれに対する解決策て無いのですかね?

2010/07/06 11:01:30
id:JULY No.3

回答回数966ベストアンサー獲得回数247

ポイント26pt

Manpage of SUDO

「-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 で起動されたプログラムへの標準入力となってしまいますので、注意が必要です。

id:umiyosh

ご回答ありがとうございます。

> /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を生成すると発生する問題のようです。

2010/07/06 18:40:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません