私はインタラクティブなシェルスクリプトを使用しており、ある場所で別のマシン(Ubuntuベース)にsshしてrootとして何かを実行する必要があります(ユーザーはパスワードを入力する必要がありますが、リモートコマンドはスクリプトに記載されているように実行する必要があります)。
# ...
ssh remote-machine 'Sudo ls'
# ...
ただし、私は常にこのエラーメッセージを受け取ります。
Sudo: no tty present and no askpass program specified
わかりました。しかし、どうすればこれを回避できますか?このようなことが起こるはずです:
$ ssh remote-machine 'Sudo ls /'
[Sudo] password for user1:
/bin
/etc
/var
不思議なssh
には、すべての治療法があります。重要なのは、-t
フラグを追加して、sshに疑似ttyを割り当てさせることです。
ssh -t remote-server 'Sudo ls'
このメソッドは、sshの後にSudoを使用して単一のスクリプトを実行します。
Sudo機能を持つ「リモート」ユーザーがいて、rootとして実行するスクリプトがあるとします。
1)ログイン時に使用するスクリプトを/ etc/passwdに設定します。
remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh
2)「login.sh」内で、実行するスクリプトを「Sudo」として実行します。
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
#Not running as root, so we execute "Sudo"
Sudo /usr/local/bin/script.sh
else
#We are already rooted, so "Sudo" is not required.
/usr/local/bin/script.sh
fi
exit;
通常、パスワードを2回尋ねます:sshログイン+ Sudo。一度だけ入力したい場合は、 パスワードなしのSudo を試してください(推奨されません)。 <-Boldewynのコメントを読んでください。
主な利点は、「ssh」が他のパラメーター(-tなど)を必要とせず、Sudoがサーバー側で強制されることです。また、スクリプトが終了すると、ユーザーもログアウトされます。
それはそれほどエレガントではないかもしれませんが、シンプルで機能します。