ssh -tを介してリモートでsudoコマンドを実行するには?

ssh -tを介してリモートでsudoコマンドを実行するには?

ssh -t経由でリモートホストにログインするスクリプトがありますsudo service foo restart

要件は、リモートホストにパスワードの入力を求められないようにすることです。リモートホストはSSH証明書を介して認証されます。このユーザーにはリモートホスト上のファイルがsudoers許可されますNOPASSWD

ただし、テスト中にパスワードを入力するように求められましたが、これは許可されていません。-tフラグなしで手動で実行すると機能します。しかし、-tフラグはすべてをあまり重要にしません。

解決策はありますか?

答え1

requirettyオプションを無効にして実行することもできます。sudoersssh いいえフラグ-t(またはおよび-T)が有効です。

次のものを追加しますsudoers(テストされていません)。

Defaults:{your ssh user} !requiretty

これをNOPASSWDすでに使用しているコマンドと組み合わせると、pseudo-ttyを割り当てなくてもsudoコマンドを実行できます。

requirettyユーザーの代わりにコマンドを変更することもできます。

答え2

SSHキーを生成してリモートホストに送信します。

  1. 次のコマンドを使用して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
    
  2. /root/.ssh/id_rsa.pubキーを見つけてリモコンに送信するには、次のコマンドを使用します。

    ssh-copy-id -i /root/.ssh/id_rsa.pub root@remote:/root
    

今ログインしてみてください。リモートパスワードを要求しません。

答え3

私にとってはこれはうまくいきますが、次のように警告してください。 stdin が端末ではないため、疑似端末は割り当てられません。

ssh -t username@hostname1 << 'EOS'
sudo sh
hostname
EOS

Pseudo-terminal will not be allocated because stdin is not a terminal.
hostname1

関連情報