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以下は、リモートで実行するために使用するスクリプトの 1 つのバージョンです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: 

2 回目のプロンプトの後にパスワードを入力すると、ターミナルに文字が表示され、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コマンドはテキストをリモート ホストに送信します。詳細については、他の回答で指定されたリンクを参照してください。

関連情報