web-dev-qa-db-ja.com

SSH経由のRsyncでttyが存在しない

Debianのrootのcrontabで次のコマンドを使用しています。

rsync -vqrlHEAXogDtzhi --log-file=${LOG} --progress --rsync-path="Sudo /usr/bin/rsync" --exclude-from=$CONFIG_DIR/excludes -e "ssh -i /home/backups/.ssh/id_rsa" backups@${HOSTNAME}:/ ${BACKUP_DIR}

そして、私は以下を得ています:

Sudo: no tty present and no askpass program specified

私は-tをsshコマンドに追加しようとしました、そして私は得ます:

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

私は-t -tをsshコマンドに追加しようとしました、そして私は得ます:

protocol version mismatch -- is your Shell clean?

リモートボックスのバックアップユーザーに.hushloginを追加し、リモートボックスへのキーを使用して、何も表示されていない状態で(ログインがハッシュされている)バックアップとしてsshできることを確認しました。まだこれらのメッセージが表示されます。

キーを使用してリモートボックスへのバックアップとしてsshを正常に実行できることに注意してください。

私のSudoには-ttオプションがないことに注意してください。

以下がソースと宛先の/ etc/sudoersファイルに設定されていることに注意してください。

backups ALL= NOPASSWD:/usr/bin/rsync

/ etc/sudoersファイルには以下への参照がないことに注意してください。

Defaults    requiretty

コマンドでパスワードをエコーし​​ないことに注意してください。

どうすればこの猫の皮を剥ぐことができますか? :|

ありがとう

6
Lynn Owens

物事を考えすぎることもあります。

リモートシステムにRsyncがインストールされていません。

/ facepalm

6
Lynn Owens

これをここに置いて、このトリックを覚えて共有できるようにします。

rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; Sudo /usr/bin/rsync"   user@${HOSTNAME}:/ ${DEST_DIR}

この方法は、一部のシステムのデフォルトの/etc/sudoersファイルにDefaults requirettyが適用されているため、ttyの要件をバイパスしているようです。この情報は this SO Question&Answers を確認した後に作成されました。

その回答では、Defaults requiretty/etc/sudoersから削除することをお勧めしています。これは簡単な方法です。ただし、リモートホスト/etc/sudoersを変更してこの構成オプションを削除できない場合は、ローカルrsyncssh -ttを使用するように強制することができます。 sshのこのオプションは sshクライアントマニュアルページ に次のように記述されています:

擬似端末割り当てを強制します。これは、リモートマシンで任意の画面ベースのプログラムを実行するために使用できます。メニューサービスを実装するとき。複数の-tオプションは、sshにローカルttyがない場合でも、tty割り当てを強制します。

したがって、sshに疑似ttyを割り当ててエラーを回避します。

Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Inappropriate ioctl for device
Sudo: sorry, you must have a tty to run Sudo

次に、--rsync-pathを次のコマンドでオーバーライドします。

stty raw -echo; Sudo /usr/bin/rsync

stty raw -echoは、リモート端末の回線規則をパススルーとして設定するためのものです。これにより、-ttなしの疑似端末の代わりに使用されるパイプのように動作します。

次に、リモートrsyncコマンドはSudo /usr/bin/rsyncになります。これには、疑似ttyがあり、requirettySudoのチェックに合格します。

2
TrinitronX
  1. Sudoジョブがrootとして実行されている場合、cronは必要ありません。
  2. 不要なフラグがたくさんあります:-rlptgoD;削除して-aに置き換えます。
  3. SudoからのTTYメッセージはlocal TTYに対するものですが、sshに対する-tオプションはremote TTYに対するものです。 2つを混同しないでください。
  4. -v-qは互いに矛盾しませんか?
  5. 最後の心配は、ローカルSSH秘密鍵が暗号化されているかどうかです。前者は、無人実行(たとえば、stdinがTTYではないもの、ターミナルまたはターミナルエミュレーターから実行されないもの)では使用できません。

編集/更新

  • 1と2を取り戻します。
  • 3は、cronが実行されているときにローカルTTYがないことであり、ローカルのTTYがないため、SSHはリモートでTTYを割り当てません。
1
pilona

これはsshの鍵の問題だと思います。バックアップの秘密鍵にパスフレーズがあるか、公開鍵がリモートユーザーのキーチェーンにありません。多分あなたの以前の試みはあなたのキーチェーンにすでにロードされたキーを使用しましたか?

0
toppledwagon