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
コマンドでパスワードをエコーしないことに注意してください。
どうすればこの猫の皮を剥ぐことができますか? :|
ありがとう
物事を考えすぎることもあります。
リモートシステムにRsyncがインストールされていません。
/ facepalm
これをここに置いて、このトリックを覚えて共有できるようにします。
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
を変更してこの構成オプションを削除できない場合は、ローカルrsync
にssh -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があり、requiretty
のSudo
のチェックに合格します。
Sudo
ジョブがrootとして実行されている場合、cron
は必要ありません。-rlptgoD
;削除して-a
に置き換えます。Sudo
からのTTYメッセージはlocal TTYに対するものですが、ssh
に対する-t
オプションはremote TTYに対するものです。 2つを混同しないでください。-v
と-q
は互いに矛盾しませんか?stdin
がTTYではないもの、ターミナルまたはターミナルエミュレーターから実行されないもの)では使用できません。編集/更新:
cron
が実行されているときにローカルTTYがないことであり、ローカルのTTYがないため、SSHはリモートでTTYを割り当てません。これはsshの鍵の問題だと思います。バックアップの秘密鍵にパスフレーズがあるか、公開鍵がリモートユーザーのキーチェーンにありません。多分あなたの以前の試みはあなたのキーチェーンにすでにロードされたキーを使用しましたか?