Java 使用Jsch在远程EC2实例上创建文件夹

Java 使用Jsch在远程EC2实例上创建文件夹,java,ssh,amazon-ec2,jsch,Java,Ssh,Amazon Ec2,Jsch,我想从另一个EC2实例在远程EC2实例上创建一个文件夹,然后将一些数据复制到其中 我试图使用JSch创建文件夹,并传递命令sudo mkdir/data,但我得到的错误是sudo:对不起,您必须有一个tty才能运行sudo。如果没有sudo,我也无法创建文件夹。我尝试使用((ChannelExec)channel.setPty(true),通过使用它我可以创建文件夹,但之后我无法复制任何数据,甚至无法从命令行ssh EC2实例。(如果我手动创建文件夹,则复制数据成功)。有人能告诉我应该怎么做吗?

我想从另一个EC2实例在远程EC2实例上创建一个文件夹,然后将一些数据复制到其中


我试图使用JSch创建文件夹,并传递命令
sudo mkdir/data
,但我得到的错误是
sudo:对不起,您必须有一个tty才能运行sudo
。如果没有sudo,我也无法创建文件夹。我尝试使用
((ChannelExec)channel.setPty(true)
,通过使用它我可以创建文件夹,但之后我无法复制任何数据,甚至无法从命令行ssh EC2实例。(如果我手动创建文件夹,则复制数据成功)。有人能告诉我应该怎么做吗?谢谢,下面的例子怎么样

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

我不熟悉JSch。但是,如果您具有root访问权限,您可以更新sudoers配置文件来解决这个问题。将以下行添加到/etc/sudoers

Defaults:USERNAME_HERE !requiretty
也许其他人可以详细说明这是否是一个坏主意,这超出了我的知识范围,但我想知道更多

我只在一种特定情况下使用这种方法。我们有一个cronjob,它通过rsync备份远程服务器集群,但是rsync要成功运行,它需要sudo权限

为了解决这个问题,我做了以下几点-

  • 在本地和远程服务器上创建了用户“backupuser”
  • 在/etc/sudoers中添加了以下两行-仅在您要向其上的用户授予sudo权限的服务器上需要。在我们的例子中,仅在远程服务器上

    backupuser ALL = NOPASSWD: /usr/bin/rsync
    DEFAULTS:backupuser !requiretty
    
  • 添加这两行将授予用户rsync命令的“backupuser”sudo权限,而无需输入密码和所需的tty连接

    下面是它的工作原理-

    第一行分成两部分

    USER SPECIFICATION OPTION_TAG (: CONDITIONS(opt))
    
  • 用户规范-设置这些选项也适用的用户

  • OPTION_TAG-您要授予的选项的标签。在这种情况下,用户被授予sudo权限,而无需输入密码。(有关可用标签的列表,请参见man sudoers

  • 条件-您还可以选择在授予sudo特权时设置条件。在这种情况下,用户只有sudo权限来运行rsync命令

    : /usr/bin/rsync
    
  • 第二行覆盖sudo命令的默认要求,即运行sudo需要终端连接(tty要求)。并且它仅将此权限授予用户帐户“backupuser”。(有关其他默认设置,请参见man sudoers


    希望这有助于回答您的问题。我知道这有点相切,但我想给出一个完整的解释。有关更多信息,您也可以查看man sudo

    Alan感谢您提供的详细答案,但我认为这对我来说不起作用,因为我正在运行中创建EC2实例,并且在/etc/sudoers中无法更改任何内容,而无需更改其权限设置,因此我需要在RHEL 6.3实例中再次使用sudoHere,一切都与setPty完美配合(真实);如何阻止伪终端。您是简单地使用setPty(false)还是还需要做其他事情?
    ALL = NOPASSWD
    
    : /usr/bin/rsync
    
    DEFAULTS:backupuser !requiretty