here-documentでSSH経由でコマンドを実行するときにTTYが存在しない


10

私はヒアドキュメントでこのようにSSH経由でコマンドを実行しようとしています:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

これは、sudoのパスワードなど、入力が必要なものを実行しようとしている場合を除いて、通常は機能します。その場合、次のメッセージが表示されます。

sudo: no tty present and no askpass program specified

-tSSH のフラグを使用して、次のような疑似ttyを割り当てることができます。

ssh -t example.com "sudo /etc/init.d/apache2 reload"

動作しますが、ヒアドキュメントで同じことをしようとすると、動作せず、ttyが存在しないという同じエラーが発生します。

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

どうすればこれを機能させることができますか?

また、なぜ同じ行に渡すのではなく、ヒアドキュメントを操作する必要があるのか​​疑問に思う場合は、入力コマンド(いくつかある場合があります)がスクリプトによって読み取られた構成ファイルから取得されるためです引用符や二重引用符などのコマンドをエスケープする問題を回避できると聞きました。

回答:


6

visudosudoersファイルを編集し、以下の行を挿入するために使用します。

Defaults:<user>    !requiretty

を使用しssh -t "something" versus ssh -t <<STOP something STOPても動作しない理由は回答されていません。私がsudoを使用していないが、自分のユーザーに直接passwdを使用しているとしましょう。それでも、ヒアドキュメントを使用してTTYを取得できません。

ssh -t -tstdinが端末でない場合でも、疑似tty割り当てを強制しようとします。


おかげで、私は他の場所でこの修正を見てきましたが、それはsudoを使用するコマンドの問題を回避するだけです。ssh -t "何か"とssh -t <<何かを停止するSTOPが機能しない理由を答えません。私がsudoを使用していないが、自分のユーザーに直接passwdを使用しているとしましょう。それでも、ヒアドキュメントを使用してTTYを取得できません。
lpfavreau 2011

回答を更新しました。
クォンタム2011

1

ssh -tコマンドの引数として与えられる変数にヒアドキュメントを単に保存しないのはなぜですか。

より一般的な注意ssh -Tとして、リモートホストの標準入力がヒアドキュメントからリダイレクトされる場合(sshptyの割り当てを防止するため)、リモートシェルをコマンド引数として使用または指定します。

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.