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
コマンドはテキストをリモート ホストに送信します。詳細については、他の回答で指定されたリンクを参照してください。