从本地计算机在远程系统上运行命令
我需要通过 ssh 连接在远程 lubuntu 22.04 系统上执行命令,但不打开 shell。该指令将在脚本内执行。该脚本在我的本地系统(安装了其他 Ubuntu 发行版)上执行。我发现我可以成功地做到这一点,在本地系统上执行以下脚本:
# define a variable which stored the password
MYPASSWORD='mypassword'
sshpass -p $MYPASSWORD ssh myus[email protected] "cp /home/myuser/file1 /path/to/dest/"
在我使用的命令(安装在我的本地系统上)中,以避免输入验证 ssh 会话所需的sshpass
用户密码。myuser
我的需求
我还必须cp
像前面一样执行命令,但文件的目标是 的子文件夹/etc
,这需要sudo
特权。所以脚本变成:
MYPASSWORD='mypassword'
sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S cp /home/myuser/file1 /etc/sub/folder/"
如果我执行该脚本,该脚本的最后一个命令将输出以下请求:
[sudo] password for myuser:
因此脚本停止执行并等待密码sudo
。
我不想要这个!
我的一次尝试
如果我执行命令:
> echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/
直接在远程系统的终端上运行并复制,file1
无需/etc/sub/folder/
询问sudo
密码。
但是如果我在本地系统上执行以下命令:
sshpass -p 'mypassword' ssh [email protected] "echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/"
它不起作用!
我的问题
有没有办法避免通过键盘输入密码sudo
?可以自动发送密码吗?
我找到了解决方法/解决方案。
使用临时存储密码的文件
sudo
我修改了在本地系统中执行的脚本,添加了一些命令,如下所示:
echo
;该文件被调用并且仅包含用户的password.txt
密码( ) 。"mypassword"
myuser
password.txt
直接作为sudo
操作员命令的输入<
。sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
该解决方案用于安全的开发环境,因此不会破坏任何安全约束。
新脚本
使用此指令,在本地系统中执行的脚本将变为:
抑制输出
sudo -S
我发现了另一个改进,它允许抑制从 ssh 发送到本地系统的
[sudo] password for myuser:
命令的输出 ( ) 。 使用如下所示的操作器和设备就足够了:sudo -S
&>
/dev/null
注意
[sudo] password for myuser:
在我的本地系统中,通过以下重定向抑制输出:&>/dev/null
>&/dev/null
这是正常的,因为以前的运算符是等效的(请参阅SuperUser 上的这篇文章)。
通过以下重定向,抑制不起作用:
>/dev/null