2012-08-13 46 views
1

我想從另一個EC2實例在遠程EC2實例上創建一個文件夾,然後將一些數據複製到其中。使用Jsch在遠程EC2實例上創建文件夾

我試圖使用JSch創建文件夾並傳遞命令​​但我得到的錯誤是sudo: sorry, you must have a tty to run sudo。如果沒有sudo,我也無法創建文件夾。我嘗試使用((ChannelExec) channel).setPty(true)並通過使用這個我可以創建文件夾,但事後我無法複製任何數據,甚至不能從命令行ssh的EC2實例(如果我創建文件夾manualy然後複製數據成功完成)。有人可以請指導我應該怎麼做。謝謝

+0

這裏在一個RHEL 6.3的實例,一切工作完美的setPty(true); – koppor 2012-08-21 16:00:13

+0

你如何阻止僞終端?你使用簡單的setPty(false)還是需要做別的事情? – waqas 2012-08-22 09:38:41

回答

0

下面的例子如何?

http://www.jcraft.com/jsch/examples/Sudo.java.html 
+0

http://stackoverflow.com/questions/11968805/use-of-jsch-sudo-example-and-channel-setpty-for-running-sudo-command-on-remote-h – waqas 2012-08-15 12:06:02

0

我不熟悉JSch。但是如果你有root權限,你可以更新你的sudoers配置文件來解決這個問題。添加下面一行到/ etc/sudoers文件

Defaults:USERNAME_HERE !requiretty 

也許別人可以詳細說明這是否是一個好主意或沒有,這超出了我的知識範圍,但我很想知道更多嗎?

我只在一個特定的情況下使用這種方法。我們有一個通過rsync備份遠程服務器集羣的cronjob,但爲了成功運行rsync,它需要sudo權限。

要解決這個問題,我做了以下事項

  1. 創建了一個用戶「backupuser」 - 在兩臺服務器上本地&遠程
  2. 添加以下兩行到/ etc/sudoers文件 - 只需在你想要爲用戶授予sudo權限的服務器。在我們的例子中,只在遠程服務器上。

    backupuser ALL = NOPASSWD: /usr/bin/rsync 
    DEFAULTS:backupuser !requiretty 
    

添加上述兩行授予用戶,「backupuser」須藤權限rsync命令,而無需輸入密碼,沒有必要的TTY連接。

以下是它的工作原理 -

第一行分爲兩部分。

USER SPECIFICATION OPTION_TAG (: CONDITIONS(opt)) 
  1. 用戶規範 - 設置這些選項適用(S)也給用戶。

    backupuser 
    
  2. OPTION_TAG - 您要授予選項的標籤。在這種情況下,用戶被授予sudo權限而不必輸入密碼。 (見人sudoers的可用的標籤列表)

    ALL = NOPASSWD 
    
  3. 條件 - 你也必須把關於何時授予須藤權限條件的選項。在這種情況下,用戶只有sudo權限才能運行rsync命令。

    : /usr/bin/rsync 
    

第二行,覆蓋您需要一個終端連接到運行須藤(TTY要求)sudo命令的默認要求。並且它僅將該特權授予用戶帳戶'backupuser'。 (見人sudoers的爲其他默認設置)

DEFAULTS:backupuser !requiretty 

希望這有助於解答您的問題。我知道它有一點切線,但我想給出一個完整的解釋。對於更多的信息,你也可以結帳man sudo

+0

艾倫謝謝你的詳細答案,但我認爲它不適用於我,因爲我在運行時創建了EC2實例,並且不更改/ etc/sudoers中的任何內容而不更改其權限設置,爲此我需要使用sudo – waqas 2012-08-14 13:37:39

相關問題