web-dev-qa-db-ja.com

「apt-getinstall」を実行してもSSHセッションが閉じない

問題

非対話型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は使用可能ですが)と文句を言います。
  • Debconfのフロントエンドに関連して、SSHでTTYを強制するために-tを渡すことは役に立ちません。どちらもDEBIAN_FRONTEND=noninteractiveではありません。
  • すべてはUbuntu12_04LTSで行われました。
14
Eric Platon

SFに関する次の回答がトリックを行いました。

cron bashスクリプトから実行すると、sshはリモートコマンドの実行に失敗します

-tフラグは、おそらくローカルにTTYがない場合を除いて、疑似tty割り当てを強制します。しかし、-t -tのようにフラグを2回渡すと、それを行うふりをするだけです。そしてそれは問題を解決しました。

SSHのドキュメントを参照してください。

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

さて、なぜそれがうまくいったのですか? debconfはログのフロントエンドについてもう文句を言わないことがわかりました。したがって、必要に応じてダブル-tセット(ルアー?)debconfを設定します。これにより、apt-get installの完了によりSSHセッションを正常に終了できます。

6
Eric Platon

Debian/jessieの下で、私はこのコマンドで成功しました:

ssh user@Host "TERM=READLINE Sudo apt-get install --reinstall less && echo done"

しかし、おそらく、このタスクやその他の今後のタスクにansibleを使用することを検討する必要があります http://docs.ansible.com/ansible/apt_module.html

1
ThorstenS

私がそれを調べたとき、これは仕事をするかもしれません。コマンドを呼び出すと、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

1
koressak