Bagaimana saya bisa memulai sesi layar dengan perintah over ssh di server jauh dari desktop saya?

57

Saya ingin dapat meluncurkan sesi layar pada server jauh dari satu perintah ssh di desktop saya. Namun, layar sepertinya membutuhkan terminal, yang tidak tersedia saat menjalankan perintah melalui ssh.

Jadi yang jelas

ssh [email protected] screen "tail -f /var/log/messages"

(sebagai contoh) tidak berfungsi, dan memberi

Must be connected to a terminal.

Saya ingin ssh untuk meluncurkan perintah di bawah layar sehingga saya bisa masuk nanti dan melampirkan seperti saya akan ke sesi layar saya akan diluncurkan secara manual.

Thomas Vander Stichele
sumber
Selain itu, Anda dapat menekan kesalahan ini bukan melalui penggunaan layar yang buruk. Saya memiliki fungsi shell yang melakukan exec <foo untuk membaca dari file. Jauh kemudian dalam skrip besar saya mencoba meluncurkan layar. Semua metode di bawah ini obv. gagal karena pelakunya adalah eksekutif. Satu untuk diingat. Pastikan Anda tidak membunuh stdin Anda sendiri secara tidak sengaja.
Neil McGill

Jawaban:

77

Coba gunakan opsi -t untuk ssh

ssh -t [email protected] screen "tail -f /var/log/messages"

Dari man ssh

Alokasi kekuatan pseudo-tty. Ini dapat digunakan untuk menjalankan perintah
        trary program berbasis layar pada mesin jarak jauh, yang bisa
        sangat berguna, misalnya saat mengimplementasikan layanan menu. Banyak -t
        opsi memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal.
Kjetil Joergensen
sumber
Saya mencoba hal yang sama dengan tmux ssh -t user@machine tmux attachdan saya dapat melampirkan sesi tmux jarak jauh tetapi itu mengacaukan dengan pengkodean karakter. Ini hanya menampilkan karakter ascii. Apakah ada perbaikan untuk ini?
Macario
1
@ Mario Anda mungkin ingin membuka pertanyaan terpisah untuk ini, sementara itu terkait secara tangensial ketika Anda menjalankannya dengan ssh -t, sepertinya ini terkait dengan pengaturan LC_ * berbeda untuk menjalankan secara interaktif vs non-interaktif. Ketika Anda melewati baris perintah ke ssh untuk dieksekusi, itu akan dieksekusi dengan lingkungan non-interaktif. Mungkin juga karena kurangnya variabel lingkungan TERM yang dilewati ketika mengeksekusi secara non-interaktif, dalam hal ini tmux tidak akan tahu apa sebenarnya kemampuan terminal Anda, dan kembali ke penyebut yang paling tidak umum.
Kjetil Joergensen
Saya tidak menggunakan ssh tetapi menghadapi masalah yang sama. Tolong bantu. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou
32

Anda dapat gunakan:

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

Itu memulai layar terpisah dengan perintah berjalan di atasnya.

   -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.
Alakdae
sumber
1
Jawaban Anda sama baiknya, sayang sekali saya harus memilih. Mungkin seseorang harus mengedit jawaban pertama dan menambahkan informasi Anda.
Thomas Vander Stichele
8

Jawaban telat, tapi inilah yang saya lakukan, saya membuat alias (sebut saja t) yang melakukan ini:

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

Ini memberitahu sshmenonaktifkan agen dan penerusan X11, dan memberitahu screenuntuk melampirkan sesi berjalan, mulai yang baru jika perlu, gunakan ^Zsebagai perintah breakout, gunakan UTF-8 dan cerdas tentang terminal.

Semua ini berarti saya dapat membuka terminal, mengetik tdan itu akan membuka sesi layar saya di $ MYSERVER. Saya kemudian dapat membuka terminal lain, melakukan hal yang sama dan saya mendapatkan jendela lain untuk sesi yang sama.

Sangat menyenangkan memiliki beberapa terminal windows ke sesi layar yang sama sehingga Anda dapat melihat dua tab layar sekaligus.

w00t
sumber
1
Saya membaca beberapa halaman tidak cukup menjawab apa yang saya cari tetapi Anda berhasil. Saya berasumsi layar atau tmux mungkin ada di sebagian besar server akhir-akhir ini, dan yang saya hubungkan mungkin berpotensi fana jadi saya tidak ingin mengacaukan bashrc seperti yang disarankan sebagian besar jawaban. Anda juga bisa menjadikan ini fungsi di shell Anda dan menerima argumen seperti $ host dan $ command (yang akan Anda masukkan di akhir). Dan alih-alih tmeng- hardcoding alias Anda yang merupakan satu host, Anda dapat menggabungkannya dengan nama host di ssh_config Anda.
dragon788
@ dragon788 memang, saya membuatnya berfungsi sekarang dan mengganti $ MYSERVER dengan "$ @". Saya masih sering menggunakan ini.
w00t
4

Dengan meletakkan berikut ini di file ~ / .bashrc di server saya, ia memulai sesi layar saat pertama kali saya masuk ke server, atau jika ada yang sudah berjalan, sambungkan kembali saya ke sesi itu.

Saya menemukan ini sangat berguna:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
Brent
sumber
Saya mencoba ini, tetapi ketika saya melakukannya screen -lssaya tidak melihat sesi layar
Tarun