从本地计算机在远程系统上运行命令
我需要通过 ssh 连接在远程 lubuntu 22.04 系统上执行命令,但无需打开 shell。该指令将在脚本内部执行。该脚本在我的本地系统上执行(安装了其他 Ubuntu 发行版)。我发现我可以成功执行此操作,在本地系统上执行以下脚本:
# define a variable which stored the password
MYPASSWORD='mypassword'
sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"
在我使用的命令中sshpass
(安装在我的本地系统上),避免输入验证myuser
ssh 会话所需的用户的密码。
我的需求
我还需要执行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
?是否可以自动发送密码?
答案1
我找到了解决方法/解决方案。
使用临时存储密码的文件sudo
我修改了在本地系统上执行的脚本,添加了一些如下所示的命令:
- 通过命令在远程系统的文件夹中创建一个文本文件
echo
;该文件被称为并且仅包含用户的password.txt
密码( ) 。"mypassword"
myuser
- 该文件由操作员
password.txt
直接作为命令的输入。sudo
<
- 命令的执行
sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
- 从远程系统删除文件 /home/myuser/password.txt
该解决方案用于安全的开发环境中,因此不会破坏任何安全约束。
新剧本
根据该指令,在本地系统上执行的脚本将变成:
MYPASSWORD='mypassword'
# creation of the file password.txt on the home folder of the remote system
sshpass -p $MYPASSWORD ssh [email protected] "echo $MYPASSWORD > /home/myuser/password.txt"
# execution of the command which needs the sudo privileges (on remote system)
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/"
# The '<' directs file passowrd.txt as input to sudo ===========================
# deletion of the file password.txt
sshpass -p $MYPASSWORD ssh [email protected] rm /home/myuser/password.txt
抑制输出sudo -S
我发现了另一个改进,它允许抑制从 ssh 发送到本地系统的[sudo] password for myuser:
命令的输出 () 。 使用如下所示的操作员和设备就足够了:sudo -S
&>
/dev/null
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S \
< /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/" &> /dev/null
笔记[sudo] password for myuser:
在我的本地系统中,通过以下重定向来抑制输出:
&>/dev/null
>&/dev/null
这是正常的,因为前面的运算符是等效的(参见这个帖子超级用户)。
镇压不起作用通过以下重定向:
>/dev/null