2011-07-27 47 views
1

我想用net:ssh2運行各種命令,但是這些命令需要以root身份運行。我通過SSH禁用了root登錄,並且我已經設置了密鑰,因此我可以使用ssh並使用'sudo su - root'來獲取root密碼。問題是我需要運行多個命令,所以我想知道是否可以連接,然後sudo root,然後運行我需要的所有命令,而無需將回顯傳遞給sudo或使用expect。NET :: SSH2與sudo

我正在使用的代碼的相關部分如下,如果可能的話,我最好喜歡在exec($ commands [0])之前使用 sudo。

編輯:我不能直接登錄到有根或沒有密碼的根,因爲它不幸地違反了政策。我必須先與我的用戶聯繫。

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參數,它將一個命令傳遞給shell執行,然後完成貝殼。這很可能對應於shell的-c參數,它實際上很高興地接受這裏的複合命令,例如,由;分隔的命令列表。

因此執行

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

能在這裏工作。 (甚至只有一個的命令,然後反覆調用這些。)

(不過,我覺得可能是一些錯誤的設置,如果他們允許密碼的sudo su - root,但不正常的sudo命令執行。)

+0

謝謝!這應該完美。我們只能使用'sudo su - '的原因是因爲它在sudoers文件中受到限制。我沒有設置所有的規則,所以我不能說爲什麼它完成了,這裏是sudoers文件的樣子:%ourgroup ALL =(ALL)NOPASSWD:/ bin/su - root – zoite

1

而不是使用sudo su -剛剛着手sudo每個命令的。如果你被允許須藤不用密碼就應該只是罰款:

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

如果你的命令需要root用戶的路徑只需指定的完整路徑。 (不能說,因爲你沒有顯示出什麼命令。)

+0

我會這樣做,但sudo本身需要密碼。我必須做一些像'echo'命令「| sudo su - root',雖然確實有效,但我覺得這是一種非常醜惡的做事方式,但如果沒有其他辦法,我會以最後的方式做到這一點 – zoite

+1

@zoite:我不是系統管理員,但聽起來像一個非常奇怪的方式來設置sudo權限。 –

+0

可以更改sudo以允許用戶在沒有密碼的情況下進行切換。如果您必須在某個時候輸入密碼,則必須使用Expect。 – Cfreak