ssh -t
を介してリモートホストにログインし、Sudo service foo restart
を使用するスクリプトがあります。
要件は、リモートホストでのパスワードのプロンプトを回避することです。リモートホストはSSH証明書を介して認証します。リモートホストのsudoers
ファイルにより、そのユーザーはNOPASSWD
を使用してサービスコマンドを実行できます。
ただし、テスト中はパスワードの入力を求められ、これは受け入れられません。これを-t
フラグなしで手動で実行すると、機能します。ただし、-t
フラグはすべてをスローします。
これを回避する方法はありますか?
requiretty
のsudoers
オプションを無効にしてssh
without the -t
フラグ(または-T
)は機能します。
次のようなものをsudoers
に追加します(テストされていません):
Defaults:{your ssh user} !requiretty
これを、すでに使用しているNOPASSWD
と組み合わせると、疑似ttyを割り当てなくてもSudoコマンドを実行できるはずです。
ユーザーの代わりにコマンドのrequiretty
を変更することもできます。
SSHキーを生成し、それをリモートホストに転送します。
次のコマンドを使用して、RSA SSHキーを生成します
[root@localhost ~] ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): Hit ENTER
Enter passphrase (empty for no passphrase): Hit ENTER
Enter same passphrase again: Hit ENTER
検索/root/.ssh/id_rsa.pub
および次のコマンドを使用して、そのキーをリモートに転送します。
ssh-copy-id -i /root/.ssh/id_rsa.pub root@remote:/root
ログインしてみてください。リモートパスワードは要求されません。
私にとってはこのようにうまくいきましたが、次の点に注意してくださいstdinは端末ではないため、疑似端末は割り当てられません
ssh -t username@hostname1 << 'EOS'
Sudo sh
hostname
EOS
Pseudo-terminal will not be allocated because stdin is not a terminal.
hostname1