Phiên SSH không bao giờ đóng khi thực thi cài đặt apt apt-get cài đặt


14

Vấn đề

Khi chạy apt-get installtrong phiên SSH không tương tác, phiên không bao giờ đóng. Thí dụ:

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

Không my_packageđược cài đặt đúng cách, nhưng phiên SSH chỉ mở lủng lẳng.

Câu hỏi

Có cờ nào để vượt qua SSH để đi apt-getlàm không?


thông tin thêm

Bối cảnh

Cài đặt từ xa được sử dụng để triển khai tự động gói trên máy chủ tích hợp. Ngay khi chúng tôi đẩy một số thay đổi mã vào kho lưu trữ, một công việc sẽ lấy mã, xây dựng gói và triển khai nó trên tích hợp để kiểm tra xem mọi thứ có hoạt động tốt không (liên quan đến việc triển khai).

Đã thử và ghi chú

  • Việc thực hiện phiên SSH tương tự apt-get updateđóng lại sạch sẽ. Lưu ý rằng apt-get updatekhông tương tác, trong khi đó apt-get installlà. Điều này có thể gợi ý rằng tính tương tác là một vấn đề.
  • Một lệnh như ssh user@target "sudo apt-get install my_package && echo Hello"không bao giờ đạt đến echo.
  • debconf phàn nàn rằng nó không thể tìm thấy một lối vào đẹp (Hiển thị, Đọc) và nó quay trở lại Teletype (mặc dù Readline có sẵn).
  • Liên quan đến frontend của debconf, việc chuyển -tsang buộc TTY bằng SSH không giúp ích gì. Cũng không DEBIAN_FRONTEND=noninteractive.
  • Tất cả đã được thực hiện trên Ubuntu 12_04 LTS.

Nếu bạn thực hiện lệnh cài đặt bằng tay (tức là ssh user@targetcác lệnh từ shell) thì nó có hoạt động chính xác không?
Nhẫn

Lệnh cài đặt chỉ hoạt động tốt khi được thực hiện thủ công (do đó dẫn đến việc có vấn đề với các loại phiên không đăng nhập / tương tác).
Eric Platon

Câu trả lời:


6

Câu trả lời sau đây về SF đã thực hiện thủ thuật:

ssh không thực thi lệnh từ xa khi chạy từ tập lệnh cron bash

Các -tlực lượng cờ một phân bổ pseudo-tty, ngoại trừ có lẽ khi không có TTY tại địa phương. Nhưng chuyền cờ hai lần như -t -tchỉ giả vờ làm. Và điều đó đã giải quyết vấn đề.

Xem tài liệu SSH:

-t Buộc phân bổ giả. Điều này có thể được sử dụng để thực thi các chương trình dựa trên màn hình tùy ý trên một máy từ xa, có thể rất hữu ích, ví dụ như khi triển khai các dịch vụ menu. Nhiều tùy chọn -t buộc phân bổ tty, ngay cả khi ssh không có tty cục bộ.

Bây giờ, tại sao điều đó làm việc? Hóa ra là debconfkhông phàn nàn nữa về frontend trong nhật ký. Vì vậy, tôi tin rằng các -tbộ đôi (mồi?) debconfKhi cần thiết, cho phép apt-get installhoàn thành để kết thúc phiên SSH một cách sạch sẽ.


Tôi tin rằng đây là một câu trả lời tốt, nhưng tôi sẽ không đánh dấu nó ngay lập tức. Đầu tiên bởi vì tôi đã tự trả lời, và thứ hai, có thể có những câu trả lời tốt hơn / chung chung hơn. Trở lại điều này trong tương lai.
Eric Platon

1

Khi tôi nhìn qua nó, điều này có thể làm công việc. Gọi bất cứ lệnh nào nên được theo sau bởi exit và heredoc. Tìm thấy giải pháp, nhưng chưa thử cá nhân.

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

Câu trả lời gốc xuất phát từ đây: http://www.thetechrepo.com/main-articles/529-execute-a-command-rem Remote-over-ssh-and-then-close-the-connection


Cảm ơn bạn, koressak. Tôi đoán điều này phụ thuộc vào hệ vỏ và phân phối HĐH. Tôi vừa thử ssh user@host free -mtrong môi trường mục tiêu của mình, và nó hoạt động như một lá bùa. Tôi sẽ thử đề nghị tiếp theo.
Eric Platon

Tôi vừa thử một cách hoàn chỉnh với cách tiếp cận heredoc. Điều đó đã không giải quyết được vấn đề. Phiên SSH treo giống như cách trình bày trong câu hỏi. Cảm ơn một lần nữa cho các phản ứng và con trỏ!
Eric Platon

1

Theo debian / jessie, tôi đã thành công với lệnh này:

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

Nhưng có lẽ bạn nên cân nhắc sử dụng ansible cho việc này và các nhiệm vụ nâng cao khác http://docs.ansible.com/ansible/apt_module.html


Thú vị, ý kiến ​​hay. Đối với Ansible, có lẽ bây giờ. Tôi không biết trở lại khi câu hỏi xuất hiện trong đầu. Dù sao, tôi tin rằng thật tốt khi biết "những gì đang xảy ra bên trong" (c).
Eric Platon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.