Sesi SSH tidak pernah ditutup saat menjalankan "apt-get install"

14

Masalah

Saat menjalankan apt-get installsesi SSH non-interaktif, sesi tidak pernah ditutup. Contoh:

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

Tidak my_packagediinstal dengan benar, tetapi sesi SSH hanya menggantung terbuka.

Pertanyaan

Apakah ada tanda untuk lulus SSH untuk mulai apt-getbekerja?


informasi tambahan

Konteks

Instalasi jarak jauh digunakan untuk penyebaran paket secara otomatis pada server integrasi. Segera setelah kami mendorong beberapa perubahan kode ke repositori, pekerjaan menarik kode, membangun paket, dan menyebarkannya pada integrasi untuk memeriksa apakah semuanya berfungsi dengan baik (sejauh penyebaran terkait).

Sudah Mencoba & Catatan

  • Eksekusi sesi SSH yang sama apt-get updateditutup dengan rapi. Perhatikan bahwa apt-get updatetidak interaktif, sedangkan apt-get install. Ini mungkin menunjukkan bahwa interaktivitas adalah masalah.
  • Perintah seperti ssh user@target "sudo apt-get install my_package && echo Hello"tidak pernah mencapai echo.
  • debconf mengeluh bahwa ia tidak dapat menemukan tampilan depan yang bagus (Tampilan, Readline), dan jatuh kembali ke Teletype (walaupun Readline tersedia).
  • Sehubungan dengan frontend debconf, meneruskan -tuntuk memaksa TTY dengan SSH tidak membantu. Tidak juga DEBIAN_FRONTEND=noninteractive.
  • Semua dilakukan di Ubuntu 12_04 LTS.
Eric Platon
sumber
Jika Anda menjalankan perintah instal secara manual (mis. ssh user@targetMaka perintah dari shell) apakah itu berfungsi dengan benar?
Cincin Ø
Perintah instal hanya berfungsi dengan baik ketika dilakukan secara manual (sehingga menyebabkan ada masalah dengan tipe sesi non-login / interaktif).
Eric Platon

Jawaban:

6

Jawaban berikut tentang SF melakukan trik:

ssh gagal menjalankan perintah jarak jauh ketika dijalankan dari skrip cron bash

The -tpasukan bendera alokasi pseudo-tty, kecuali mungkin ketika tidak ada TTY lokal. Tapi melewati bendera dua kali seperti -t -thanya berpura-pura melakukannya. Dan itu memecahkan masalah.

Lihat dokumentasi SSH:

Alokasi kekuatan pseudo-tty. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh, yang bisa sangat berguna, misalnya saat mengimplementasikan layanan menu. Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal.

Sekarang, mengapa itu berhasil? Ternyata debconftidak mengeluh lagi tentang frontend di log. Jadi saya percaya bahwa -tset ganda (umpan?) Sesuai debconfkebutuhan, yang memungkinkan apt-get installpenyelesaian untuk mengakhiri sesi SSH dengan bersih.

Eric Platon
sumber
Saya percaya ini adalah jawaban yang baik, tetapi saya tidak akan langsung menandainya. Pertama karena saya menjawab sendiri, dan kedua, mungkin ada jawaban yang lebih baik / lebih umum. Kembali ini di masa depan.
Eric Platon
1

Ketika saya melihat melalui itu, ini dapat melakukan pekerjaan. Memanggil perintah apa pun harus diikuti dengan keluar dan heredoc. Menemukan solusinya, tetapi belum mencobanya secara pribadi.

ssh user@myremotemachine <<-EOF
free -m
exit
EOF

Jawaban asli datang dari sini: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection

koressak
sumber
Terima kasih, koressak. Saya kira ini tergantung pada shell dan distribusi OS. Saya baru saja mencoba ssh user@host free -mdi lingkungan target saya, dan itu berfungsi seperti pesona. Saya akan mencoba rekomendasi selanjutnya.
Eric Platon
Saya baru saja mencoba menjalankan sepenuhnya dengan pendekatan heredoc. Itu tidak menyelesaikan masalah. Sesi SSH hang dengan cara yang sama seperti yang disajikan dalam pertanyaan. Sekali lagi terima kasih atas tanggapan dan petunjuknya!
Eric Platon
1

Di bawah debian / jessie saya berhasil dengan perintah ini:

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

Tapi mungkin Anda harus mempertimbangkan untuk menggunakan yang memungkinkan untuk ini dan tugas upcomming lainnya http://docs.ansible.com/ansible/apt_module.html

ThorstenS
sumber
Menarik, ide bagus. Adapun Ansible, mungkin sekarang. Saya tidak tahu kembali ketika pertanyaan itu muncul di benak saya. Bagaimanapun, saya percaya itu baik untuk mengetahui "apa yang terjadi di dalam" (c).
Eric Platon