Làm cách nào tôi có thể khởi chạy phiên màn hình với lệnh trên ssh trên máy chủ từ xa từ máy tính để bàn của mình?


57

Tôi muốn có thể khởi chạy các phiên màn hình trên các máy chủ từ xa từ một lệnh ssh duy nhất trên máy tính để bàn của tôi. Tuy nhiên, màn hình dường như cần một thiết bị đầu cuối, không có sẵn khi chạy lệnh thông qua ssh.

Rõ ràng

ssh root@my.machine screen "tail -f /var/log/messages"

(như một ví dụ) không hoạt động, và đưa ra

Must be connected to a terminal.

Tôi muốn ssh khởi chạy lệnh dưới một màn hình để tôi có thể đăng nhập sau và đính kèm như một phiên màn hình mà tôi đã khởi chạy thủ công.


Bên cạnh đó, bạn có thể gặp lỗi này không thông qua việc sử dụng màn hình kém. Tôi có một hàm shell đang thực hiện exec <foo để đọc từ một tệp. Rất lâu sau đó trong một kịch bản lớn, tôi đã cố gắng khởi chạy màn hình. Tất cả các phương pháp dưới đây obv. thất bại vì thủ phạm thực sự là kẻ hành quyết. Một người phải ghi nhớ. Kiểm tra bạn đã không vô tình giết stdin của riêng bạn.
Neil McGill

Câu trả lời:


77

Hãy thử sử dụng tùy chọn -t để ssh

ssh -t root@my.machine screen "tail -f /var/log/messages"

Từ người đàn ông ssh

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

Tôi đang thử tương tự với tmux ssh -t user@machine tmux attachvà tôi có thể đính kèm một phiên tmux từ xa nhưng nó gây rối với mã hóa ký tự. Nó chỉ hiển thị ký tự ascii. có cách sửa nào cho nó không?
Macario

1
@Macario bạn có thể muốn mở một câu hỏi riêng cho vấn đề này, trong khi nó liên quan một cách hữu hình khi bạn đang chạy nó với ssh -t, có vẻ như nó liên quan đến việc đặt LC_ * khác nhau để chạy tương tác so với không tương tác. Khi bạn truyền một dòng lệnh cho ssh để thực thi, nó sẽ được thực thi với môi trường không tương tác. Cũng có thể là thiếu biến môi trường TERM được thông qua khi thực hiện không tương tác, trong trường hợp đó, tmux sẽ không biết thiết bị đầu cuối của bạn thực sự có khả năng gì và rơi trở lại mẫu số ít phổ biến nhất.
Kjetil Joergensen

Tôi không sử dụng ssh nhưng đang đối mặt với cùng một vấn đề. Xin vui lòng giúp đỡ. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou

32

Bạn có thể dùng:

ssh root@host screen -m -d "tail -f /var/log/messages"

Điều đó bắt đầu một màn hình tách rời với một lệnh chạy trên nó.

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.

1
Câu trả lời của bạn cũng tốt không kém, quá tệ tôi phải chọn. Có lẽ ai đó nên chỉnh sửa câu trả lời đầu tiên và thêm thông tin của bạn.
Thomas Vander Stichele

8

Câu trả lời muộn, nhưng đây là những gì tôi làm, tôi tạo một bí danh (hãy gọi nó là t) thực hiện điều này:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

Điều này nói sshđể vô hiệu hóa chuyển tiếp tác nhân và X11, và yêu screencầu đính kèm vào một phiên đang chạy, bắt đầu một phiên bản mới nếu cần, sử dụng ^Zlàm lệnh ngắt, sử dụng UTF-8 và thông minh về thiết bị đầu cuối.

Tất cả điều này có nghĩa là tôi có thể mở một thiết bị đầu cuối, nhập tvà nó sẽ mở phiên màn hình của tôi trên $ MYSERVER. Sau đó tôi có thể mở một thiết bị đầu cuối khác, làm điều tương tự và tôi nhận được một cửa sổ khác cho cùng một phiên.

Thật tuyệt khi có nhiều cửa sổ đầu cuối vào cùng một phiên màn hình để bạn có thể xem hai tab màn hình cùng một lúc.


1
Tôi đọc qua khá nhiều trang không hoàn toàn trả lời những gì tôi đang tìm kiếm nhưng bạn đóng đinh nó. Tôi cho rằng màn hình hoặc tmux có thể có trên hầu hết các máy chủ hiện nay và những máy chủ mà tôi kết nối có khả năng phù du nên tôi không muốn gây rối với bashrc như hầu hết các câu trả lời đề xuất. Bạn cũng có thể biến điều này thành một hàm trong trình bao của mình và chấp nhận các đối số như $ host và lệnh $ (mà bạn sẽ đặt ở cuối). Và thay vì mã hóa bí danh của bạn tlà một máy chủ duy nhất, bạn có thể kết hợp nó với tên máy chủ trong ssh_config.
dragon788

@ dragon788 thực sự, tôi đã biến nó thành một hàm ngay bây giờ và thay thế $ MYSERVER bằng "$ @". Tôi vẫn sử dụng cái này rất nhiều.
w00t

4

Bằng cách đặt phần sau vào tệp ~ / .bashrc trên máy chủ của tôi, nó sẽ bắt đầu phiên màn hình vào lần đầu tiên tôi đăng nhập vào máy chủ hoặc nếu một tệp đang chạy, hãy kết nối lại tôi với phiên đó.

Tôi thấy điều này rất tiện dụng:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi

Tôi đã thử điều này, nhưng khi tôi làm screen -lsthì tôi không thấy bất kỳ phiên màn hình nào
Tarun
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.