2012-08-13 48 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

相关问题