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

相關內容