如何在ssh中sudo运行本地脚本

4

我尝试通过ssh运行本地脚本,需要使用sudo权限。

ssh $HOST < script.sh

我尝试过

ssh -t $HOST "sudo -s && bash" < script.sh

实际上,我在谷歌上搜索了很多,找到了一些类似的问题,但是我没有找到可以sudo运行本地脚本的解决方案。


可能是通过ssh正确使用sudo的方法的重复问题。 - jww
3个回答

4

阅读错误消息

$ ssh -t $HOST "sudo -s && bash" < script.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.

很明显这里出了问题。

你不能在将脚本重定向到远程会话的bash标准输入时使用ssh参数-t(这是sudo需要请求密码的)。

如果可以接受,你可以通过scp将本地脚本传输到远程机器上,然后执行脚本而无需进行I/O重定向:

scp script.sh $HOST:/tmp/ && ssh -t $HOST "sudo -s bash /tmp/script.sh"

解决此问题的另一种方法是在非交互模式下使用sudo -n,但是您需要在远程机器的sudoers文件中为执行用户设置NOPASSWD。然后您可以使用该命令。

ssh $HOST "sudo -n -s bash" < script.sh

1
为了使Edward Itrich的回答更具可伸缩性和面向频繁使用,您可以设置一个系统,在这个系统中您只需要运行一行脚本,快速地将其移植到任何主机、文件或命令中,具体操作如下:
如果您有“Scripts”目录,请在其中创建一个脚本,更改所需的脚本名称(我经常使用此格式更改脚本名称中的1个单词并创建文件,设置权限并打开进行编辑):
newscript="runlocalscriptonremotehost.sh"
touch $newscript && chmod +x $newscript && nano $newscript

在nano中,按照以下方式填写脚本,将要远程运行的脚本的目录和名称信息放置在runlocalscriptonremotehost.sh的变量行中(只需要编辑1-3行):
HOSTtoCONTROL="sudoadmin@192.168.0.254"
PATHtoSCRIPT="/home/username/Scripts/"
SCRIPTname="scripttorunremotely.sh"
scp $PATHtoSCRIPT$SCRIPTname $HOSTtoCONTROL:/tmp/ && ssh -t $HOSTtoCONTROL "sudo -s bash /tmp/$SCRIPTname"

然后只需运行:

sh ./runlocalscriptonremotehost.sh

保持在标签式文本编辑器中打开runlocalscriptonremotehost.sh以进行快速更新,创建一个bash别名来运行该脚本,并将其转化为一个常用操作的应用程序。

这是一个很好的跟进回答。 - JohnH

0
首先将您的目标分为两部分。1)ssh到主机。2)以sudo身份运行所需命令。确保您可以1)访问主机并且2)拥有sudo权限,然后您可以使用&&将两个命令组合起来。 x_cmd && y_cmd 的作用是在x_cmd成功退出后执行y_cmd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接