人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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;
}
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲


●質問者: umiyosh
●カテゴリ:コンピュータ
✍キーワード:ETC EXIT LOGiN NET password
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kick_m
●27ポイント

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

◎質問者からの返答

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


2 ● koriki-WeKan
●27ポイント

できない


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

◎質問者からの返答

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

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

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

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

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

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


3 ● JULY
●26ポイント

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ