通过在本地计算机中执行的 bash 脚本在远程服务器上运行命令(具有 sudo 权限)

通过在本地计算机中执行的 bash 脚本在远程服务器上运行命令(具有 sudo 权限)

从本地计算机在远程系统上运行命令

我需要通过 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(安装在我的本地系统上),避免输入验证myuserssh 会话所需的用户的密码。

我的需求

我还需要执行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

相关内容