在 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.sh
。sudo
如果我将最后一行替换为以下行,则访问将被阻止:
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
命令将文本发送到远程主机。您可以在另一个答案中指定的链接中找到更多信息。