具有文件管道的非根用户 SSH 特权命令

具有文件管道的非根用户 SSH 特权命令

我有一个 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.

相关内容