非対話型SSHセッションでapt-get install
を実行すると、セッションが閉じられることはありません。例:
ssh user@target "Sudo apt-get -y install my_package"
my_package
は正しくインストールされますが、SSHセッションがぶら下がっています。
apt-get
を機能させるためにSSHを渡すフラグはありますか?
リモートインストールは、統合サーバーへのパッケージの自動展開に使用されます。コードの変更をリポジトリにプッシュするとすぐに、ジョブがコードをプルしてパッケージをビルドし、統合時にデプロイして、すべてが正常に機能することを確認します(デプロイに関する限り)。
apt-get update
を実行している同じSSHセッションが正常に閉じます。 apt-get update
はインタラクティブではありませんが、apt-get install
はインタラクティブであることに注意してください。これは、双方向性が問題であることを示唆している可能性があります。ssh user@target "Sudo apt-get install my_package && echo Hello"
のようなコマンドがecho
に到達することはありません。debconf
は、Niceフロントエンド(Display、Readline)が見つからず、Teletypeにフォールバックする(Readlineは使用可能ですが)と文句を言います。-t
を渡すことは役に立ちません。どちらもDEBIAN_FRONTEND=noninteractive
ではありません。SFに関する次の回答がトリックを行いました。
cron bashスクリプトから実行すると、sshはリモートコマンドの実行に失敗します
-t
フラグは、おそらくローカルにTTYがない場合を除いて、疑似tty割り当てを強制します。しかし、-t -t
のようにフラグを2回渡すと、それを行うふりをするだけです。そしてそれは問題を解決しました。
SSHのドキュメントを参照してください。
-t疑似tty割り当てを強制します。これは、リモートマシン上で任意の画面ベースのプログラムを実行するために使用できます。これは非常に便利です。メニューサービスを実装するとき。複数の-tオプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します。
さて、なぜそれがうまくいったのですか? debconf
はログのフロントエンドについてもう文句を言わないことがわかりました。したがって、必要に応じてダブル-t
セット(ルアー?)debconf
を設定します。これにより、apt-get install
の完了によりSSHセッションを正常に終了できます。
Debian/jessieの下で、私はこのコマンドで成功しました:
ssh user@Host "TERM=READLINE Sudo apt-get install --reinstall less && echo done"
しかし、おそらく、このタスクやその他の今後のタスクにansibleを使用することを検討する必要があります http://docs.ansible.com/ansible/apt_module.html
私がそれを調べたとき、これは仕事をするかもしれません。コマンドを呼び出すと、exitとヒアドキュメントが続きます。解決策を見つけましたが、個人的に試したことはありません。
ssh user@myremotemachine <<-EOF
free -m
exit
EOF
元の答えはここから来ます: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection