「apt-get install」の実行時にSSHセッションが閉じられない


14

問題

apt-get install非対話型SSHセッションで実行している場合、セッションは決して閉じません。例:

ssh user@target "sudo apt-get -y install my_package"

my_package正しくインストールされていますが、SSHセッションがちょうどオープンぶら下がるますありません。

質問

apt-get動作するためにSSHを渡すフラグはありますか?


追加情報

環境

リモートインストールは、統合サーバーへのパッケージの自動展開に使用されます。いくつかのコード変更をリポジトリにプッシュするとすぐに、ジョブがコードを取り込み、パッケージをビルドし、統合時にそれを展開して、すべてが適切に機能することを確認します(展開に関する限り)。

すでに試してみました&ノート

  • 実行中の同じSSHセッションは正常にapt-get update終了します。apt-get updateは、インタラクティブではないことに注意してくださいapt-get install。これは、対話性が問題であることを示唆している可能性があります。
  • のようなコマンドssh user@target "sudo apt-get install my_package && echo Hello"はに到達しませんecho
  • debconf 素敵なフロントエンド(ディスプレイ、Readline)が見つからないと文句を言い、Teletypeにフォールバックします(Readlineは使用可能ですが)。
  • debconfのフロントエンドに関して、-tSSHでTTYを強制的に渡すことは役に立ちません。どちらでもないDEBIAN_FRONTEND=noninteractive
  • すべてはUbuntu 12_04 LTSで行われました。

インストールコマンドを手動で実行した場合(つまりssh user@target、シェルからのコマンド)、正しく動作しますか?
リングØ13年

インストールコマンドは、手動で実行すると正常に機能します(したがって、非ログイン/インタラクティブセッションタイプに問題があると考えるようになります)。
エリックプラトン

回答:


6

SFについての次の答えは、トリックを行いました。

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

-tフラグは、仮想端末の割り当てを強制的に、何のTTYが局所的に存在しない場合、おそらく異なります。しかし、-t -tそれを行うふりをして、フラグを2回渡すことはできます。そしてそれは問題を解決しました。

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

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

さて、なぜそれが機能したのですか?これは、ことが判明したdebconfログ内のフロントエンドについてはもう文句はありません。したがって、必要に応じてダブル-tセット(ルアー?)debconfを実行すると、apt-get installSSHセッションを正常に終了できます。


これは良い答えだと思いますが、すぐにそれをマークするつもりはありません。第一に自分自身に返信したため、そして第二に、より良い/より一般的な答えがあるかもしれません。将来的にこれに戻ります。
エリックプラトン

1

私がそれを調べたところ、これは仕事をするかもしれません。任意のコマンドを呼び出すと、exitとheredocが続きます。ソリューションを見つけましたが、個人的には試していません。

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


ありがとう、コレサック。これはシェルとOSディストリビューションに依存すると思います。ssh user@host free -mターゲット環境で試したところ、それは魅力のように機能します。次に推奨事項を試します。
エリックプラトン

ヒアドックのアプローチで完全な実行を試みました。それは問題を解決しませんでした。SSHセッションは、質問で示されたのと同じ方法でハングします。応答とポインターに再び感謝します!
エリックプラトン

1

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

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

しかし、おそらくあなたはこれと他のupcommingタスクにansible使用することを検討すべきであるhttp://docs.ansible.com/ansible/apt_module.html


面白い、良いアイデア。Ansibleについては、おそらく今。質問が思い浮かんだとき、私は戻って知りません。とにかく、「内部で何が起こっているのか」を知るのは良いことだと思います(c)。
エリックプラトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.