在 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
並使用以下腳本(未經測試,可能有bug):
#!/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
命令將該文字傳送到遠端主機。您可以在其他答案中指定的連結中找到更多資訊。