透過在本機電腦中執行的 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(安裝在我的本機系統上)中,以避免輸入myuser驗證 ssh 會話所需的使用者密碼。

我的需求

我還必須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

相關內容