使用 sudo 权限在远程服务器上运行本地脚本

使用 sudo 权限在远程服务器上运行本地脚本

在 Ubuntu 16.04 上,使用 VS Code,我想以sudo权限在远程服务器上运行本地脚本。

这是local.sh

#!/usr/bin/env bash
echo $(ifconfig | grep -Eo "inet addr:([0-9]\.?)*")
echo $(whoami)
echo "$1"

这是test.sh我用于local.sh远程运行的脚本的一个版本:

#!/usr/bin/env bash
remote="example.com"
user="username"
password="remote_password"
ssh "$user@$remote" "bash -s" < ./local.sh "'argument 1'"

运行正常。输出结果与预期一致:

$ ./test.sh 
inet addr:123.45.67.89 inet addr:127.0.0.1
username
argument 1

第一个IP地址确实是服务器的IP地址。

但是我想在远程服务器上运行local.shsudo如果我将最后一行替换为以下行,则访问将被阻止:

ssh -tt "$user@$remote" "echo $password | sudo bash -s" < ./local.sh "'argument 1'"

输出:

$ ./test.sh 
[sudo] password for username: 
Sorry, try again.
[sudo] password for username: 

如果我在第二次提示后输入密码,字符就会出现在终端中,当我按下 Enter 时,什么也不会发生,所以我使用 ^C 来取消。

如果我仅使用-t作为标志ssh,我会得到输出:

Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified

如果我根本不使用标志,我会得到:

sudo: no tty present and no askpass program specified

我见过的其他解决方案都没有取得更好的效果。任何关于我应该做什么的见解都将非常受欢迎。

答案1

为了实现你想要做的事情,请尝试expect
并保证其安全,请尝试加密你的文件

http://manpages.ubuntu.com/manpages/bionic/man1/expect.1.html

答案2

安装expect并使用以下脚本(未经测试,可能存在错误):

#!/usr/bin/expect
set remote "example.com"
set user "username"
set password "remote_password"
spawn ssh -l $user $remote
expect "$ "
send "sudo bash -s < ./local.sh 'argument 1'\r"
expect "password for $user:"
send "$password\r"
expect "$ "
send "exit\r"

expect模拟交互式会话。该spawn命令运行ssh -l $user $remote,以下命令与其交互。该expect命令等待指定的文本出现在输出中,然后send命令将文本发送到远程主机。您可以在另一个答案中指定的链接中找到更多信息。

相关内容