我有一个 SSH 服务器,其中 root 登录被禁用。我希望运行一个特权命令,该命令需要从执行后的文件中输入。我希望通过 oneliner 命令或脚本完成所有操作,无需用户交互
有密钥身份验证设置,因此仅在运行命令时需要以下密码。
我得到的最接近的是这个
echo "mypass" |ssh -tt user@ip "sudo specialCommand"
输出看起来像
mypass
[sudo] password for user:
specialCommand requests inputfile contents
mypass 之前已打印,并且也接受密码提示
commandInput
我有一个在密码被接受后尝试通过管道输入的文件
我进行了各种尝试都失败了,这些尝试实际上只是一个猜谜游戏,我怎样才能实现这一目标?
答案1
怎么样:
(echo "mypass"; cat commandInput) | ssh -tt user@ip "sudo specialCommand"
或者,由于您显然有权sudo
访问远程主机,因此如何使用visudo
此处将此行添加到/etc/sudoers
(后sudo
授予密码访问权限的现有行user
)?
user ALL=(root) NOPASSWD: /full/path/of/specialCommand
此行授予用户user
(而非其他任何人)以 root 身份运行(而非其他任何操作)的权限,specialCommand
无需密码请求。尝试通过此行执行任何其他命令sudo
仍将照常需要密码。
之后,您应该能够简单地执行以下操作:
ssh -tt user@ip "sudo specialCommand" < commandInput
答案2
如果您specialCommand
并不真正需要 tty,并且您被迫仅为密码提示ssh
创建一个 tty ,那么另一种选择是:sudo
(echo "mypass" ; cat commandInput) | ssh user@ip "sudo -Sp '' specialCommand"
选项-S
使其从标准输入读取密码,在本例中sudo
该密码来自您的,而选项则确保不显示密码提示。echo "mypass"
-p ''
那么您可能希望将密码单独放在一个文件中,并受到适当权限的保护。这通常是比在脚本中硬连线密码更好的做法。该命令将变为:
cat passwordFile commandInput | ssh user@ip "sudo -Sp '' specialCommand"
在后一种情况下,确保密码文件只有一行,只有密码,没有其他内容,否则密码行后面的内容将污染您的specialCommand
.