2011-07-27 17 views
1

net:ssh2でさまざまなコマンドを実行しようとしていますが、コマンドはrootで実行する必要があります。私はSSH経由でrootログインを無効にしています。私は鍵を設定しているので、sudo su - rootを使ってパスワードなしでrootアクセスを得ることができます。問題は複数のコマンドを実行する必要があるため、接続できるかどうか、sudoをrootにしてから、sudoにパイプをかけることなく、必要なコマンドをすべて実行することです。NET :: SSH2 with sudo

私のコードの関連セクションは次の通りです。可能であれば、exec($ commands [0])の前には sudoが好きです。

EDIT:ポリシー違反のため、パスワードの有無にかかわらずrootに直接ログインすることはできません。私はまず自分のユーザーとつながなければならない。代わりにちょうどsudoで各コマンドを続行sudo su -を使用しての

my $ssh2 = Net::SSH2->new(); 
    $ssh2->connect($server) or die "$!\n"; 
    if ($ssh2->auth_publickey($user,"/home/$user/.ssh/id_rsa.pub", "/home/$user/.ssh/id_rsa")) 
    { 
      my $chan = $ssh2->channel(); 
      $chan->blocking(1); 
      $chan->exec($commands[0]); 
      my @users; 
      while(<$chan>) {push(@users,$_);} 
      my $stdout=join("",@users); 
      print $stdout; 
    } 

答えて

2

私はこれを試していませんでしたが、su-c引数を持ちます。この引数は、実行するシェルに1つのコマンドを渡してから終了します。シェル。これはシェルの-c引数に対応している可能性があります。実際にはここで複合コマンドを受け付けます。 ;で区切られたコマンドのリスト。

したがって

sudo su -c 'command1 ; command2 ; command3 ' - root 

を実行すると、ここで仕事ができます。

(あるいはコマンドのみの1、その後、繰り返し。これらの呼び出し)(しかし、私は、彼らはパスワードなしsudo su - rootが、sudoコマンドを実行し、正常でないを許可する場合の設定に問題があるかもしれないと思う。)

+0

ありがとう!これは完全に動作するはずです。 'sudo su - 'しか使用できないのは、sudoersファイルで制限されているからです。私はすべてのルールを設定していないので、なぜそれが完了したのかは言えません。sudoersファイルは以下のようになります。%ourgroup ALL =(ALL)NOPASSWD:/ bin/su - root – zoite

1

。あなたがパスワードなしでsudoのに許可されている場合はそれだけで正常に動作する必要があります:あなたのコマンドはそれへのフルパスを指定ルートのパスを必要と

$chan->exec("sudo $commands[0]"); 

場合。

+0

私はそれをするだろうが、sudo自体はパスワードが必要です。私は "エコー"コマンドのような何かをしなければならないだろう "| sudo su - root 'とそれが動作する間、私はそれが実際には醜い方法であるように感じるが、他の方法がなければ私は最後の手段としてそれを行うだろう – zoite

+1

@zoite:私はシステム管理者ではないsudoの権利を設定するための本当に奇妙な方法です。 –

+0

sudoを変更して、ユーザーがパスワードなしで切り替えられるようにすることができます。ある時点でパスワードを入力する必要がある場合は、Expectを使用する必要があります。 – Cfreak