Bagaimana saya bisa terhubung ke output satu terminal dari terminal lain?

45

Saya perlu menghubungkan ke keluaran terminal yang sedang berjalan (tty1) dari terminal virtual dan menangkapnya (menjalankan X server).

pruzinat
sumber
5
Sementara saya mengerti bahwa kadang-kadang diperlukan untuk mengambil konten pada tty lain setelah perintah berjalan, satu ons pencegahan bernilai satu pon penyembuhan, jadi selalu pertimbangkan untuk mulai menggunakan screenatau tmuxsebelum memulai perintah yang mungkin ingin Anda akses dari terminal lain .
depquid
Dan ketika Anda bisa mempersiapkannya sebelumnya, mungkin juga tmate akan menjadi kandidat yang baik yang bahkan bekerja di internet dan tidak hanya lokal. (dan memiliki akses tulis opsional)
rugk

Jawaban:

23

Saya menemukan alat yang disebut ini ttylog. Ini adalah program Perl yang tersedia di CPAN di sini . Ini memiliki beberapa peringatan, satu yang saya hanya bisa mencari cara untuk melampirkan ke terminal yang dibuat sebagai bagian dari seseorang yang masuk ke dalam kotak saya. Yang lainnya adalah Anda harus menjalankannya dengan hak istimewa yang tinggi (yaitu root atau sudo).

Tapi berhasil!

Sebagai contoh

Pertama ssh ke dalam kotak Anda dalam TERM # 1:

TERM#1% ssh saml@grinchy

Perhatikan tty terminal baru ini:

TERM#1% tty
/dev/pts/3

Sekarang di terminal lain (TERM # 2) jalankan perintah ini:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

Sekarang kembali ke TERM # 1 dan ketik barang-barang, itu akan muncul di TERM # 2.

terminal

Semua perintah yang saya coba, (atas, ls, dll) bekerja tanpa menggunakan insiden ttylog.

slm
sumber
Persis apa yang saya cari (saya pernah menggunakannya di masa lalu, tetapi lupa nama dan tidak bisa mengingat). Terima kasih banyak, untuk sementara saya menggunakan opsi kotor (gdb dan replikasi keluaran).
pruzinat
Ya, gdbitu adalah opsi pertama yang saya temui, saya pernah menggunakannya sendiri di masa lalu, tapi setidaknya itu bagi saya, itu adalah peretasan. Senang ini membantu Anda!
slm
1
ttylog tampaknya tidak dapat melampirkan ke proses yang benar - adakah yang bisa menjawab pertanyaan saya: serverfault.com/questions/560972/…
LittleBobbyTables
21

Memang itu. Perangkat / dev / vcs * dan / dev / vcsa * sesuai dengan perangkat / dev / tty * (terminal virtual). F1 = tty1 = vcs1 / vcsa1 dan seterusnya. Vcs / vcsa seperti tty untuk terminal virtual "saat ini".

Sebagai root, Anda bisa menggunakan perangkat ini (mis. Cat / dev / vcs2), dan lihat apa yang ada di VT yang sesuai (mis. / Dev / tty2 yang menyala di F2) seperti mengambil snapshot. vcsa * berbeda dari vcs * dalam hal mereka menyertakan informasi tentang dimensi terminal (layar). Pikiran Anda, itu hanya snapshot mentah dari karakter yang ditampilkan di layar - dikumpulkan dari memori yang dialokasikan ke terminal - jadi jangan berharap output yang bagus dan mudah diurai.

Kekurangannya adalah bahwa jika informasi melewati terlalu cepat, mungkin sulit untuk ditangkap. Mungkin tail -f / dev / vcs1 akan berfungsi, jika Anda perlu mengikuti beberapa screenfull (belum mencoba sendiri)? Mungkin paling mudah untuk mengarahkan ulang ke file terlebih dahulu. Mungkin juga merupakan ide yang baik untuk menggunakan VT (F1-F6) untuk melihatnya, karena terminal akan memiliki dimensi yang sama. Dalam pengalaman saya, yang terbaik adalah menggunakan perangkat vcs * - bukan vcsa * -.

Jika itu tidak berhasil, mungkin salah satu dari paket "saudara besar" yang memungkinkan admin untuk mengawasi aktivitas di terminal dapat bekerja.

PS: Saya lupa bertanya OS apa yang kamu pakai. Ini untuk Linux, meskipun perangkat serupa mungkin ada pada OS lain juga. Coba cari "memori konsol virtual" di antara halaman manual untuk perangkat.

Baard Kopperud
sumber
Apakah ada cara untuk menyuntikkan input ke tty1 dari ssh? Sebagai contoh saya perlu bekerja dengan pi raspberry menjalankan Debian, tetapi masalahnya adalah ia hanya memiliki satu port usb, itu diambil oleh adaptor wifi, dan jadi saya tidak bisa secara fisik memasang keyboard untuk menggunakan tty1 dengannya. Karena saya perlu menjalankan skrip yang, selama proses eksekusi, dimatikan wlan0, saya benar-benar memiliki situasi menangkap-22 mencoba men-debug di mana skrip ini gagal. Misalkan saya tidak bisa menggunakan hub usb ... adakah cara bagi saya untuk mengirimkan chars ke / dev / tty1?
Steven Lu
2
Baik. Saya dapat mem-pipe hal-hal /dev/tty1sebagai root tetapi semua ini dilakukan adalah menampilkan karakter ke layar, bukan memasukkannya
Steven Lu
1
Maaf jika ini hanya kebisingan. itu tidak benar-benar 100% relevan. Tetapi saya menjawab pertanyaan saya dalam komentar di atas dengan ini
Steven Lu
18

melihat:

man 1 script

sebagai contoh:

script -f /dev/tty1
Robert
sumber
Saya sedang mencari ini. Mencoba melampirkan dengan screengagal total. Berhasil.
sdkks
5

Gunakan ttyperintah di setiap terminal untuk mengidentifikasi mereka:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Dengan asumsi TTY ini, untuk mengarahkan stdout pertama ke yang kedua, jalankan ini di terminal pertama:

exec 1>/dev/pts/1

Catatan: Sekarang setiap output perintah akan ditampilkan di pts / 1

Untuk mengembalikan stdout perilaku default dari Poin / 0:

exec 1>/dev/pts/0

Lihat video ini untuk demonstrasi.

Vitalie Ghelbert
sumber
2

Ini bekerja untuk saya:

  • Menggunakan keyboard di komputer "A" (yaitu komputer fisik yang harus dikontrol), jalankan: screen -q

  • Terhubung dengan sshdari komputer "B" ke komputer "A".

  • Di sesi ssh, ketik: screen -lsuntuk mendapatkan id sesi untuk terhubung (4 digit pada baris yang berisi tty ).

  • Sambungkan ke sesi di atas dengan: screen -x <session id>... menggunakan nomor id sesi yang diterima dari screen -lsperintah di atas.

Apa pun yang diketik dalam "sesi" akan terjadi di kedua "sesi", jadi misalnya mengetik screen -dakan keluar dari KEDUA sesi.

Ixx
sumber
1

Pendekatan lain adalah dengan menggunakan screenutilitas gnu pada mesin lokal Anda. Aktifkan dengan -Lopsi, atau mulai tanpa opsi itu dan gunakan ^aHurutan perintah. Salah satu pendekatan menyebabkan semua input & output akan dicatat ke file bernama screenlog.xx adalah nomor layar

Ini berguna karena tidak ada tambahan yang perlu dipasang pada mesin jarak jauh.

Chris Johnson
sumber
1

Karena saya tidak memulai tty1 dengan layar, skrip ini membantu:

Saya menggunakan jawaban dari Baard Kopperud di atas. "128" adalah 1 baris dari tty1 saya. Tidur dapat diatur ke nomor yang sesuai.

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

Saya menggunakan ini di terminator dan ukuran kolom sehingga gulir adalah satu baris teks.

Jeff T
sumber
Terima kasih atas idenya, pada rasperry saya hanya perlu melakukan '' 'watch cat / dev / vcs' '' Untuk menonton proses saya mulai pada konsol virtual lupa tentang menggunakan 'layar'. Dan saya baru saja menyesuaikan terminal gnome saya, saya menjalankannya dengan lebar 80 karakter.
axkibe
0

Buka dua terminal. Ketik ttymasing-masing dan Anda akan mendapatkan id sebagai/dev/pts/nº

Kemudian pada bagian pertama Anda mengetik script -f /dev/pts/nºofSecondTerminaldan pada bagian kedua Anda melakukan sebaliknya script -f /dev/pts/nºofFirstTerminalsehingga mereka ditautkan

Selamat! Kedua terminal mengeluarkan dan menerima barang yang sama. Butuh yang ketiga? Nah, sudahkah Anda mempelajari kombinasi? Anda akan membutuhkan 6 script -fperintah. Bahkan Lebih Banyak? Seterusnya ...

Marcelo Teixeira Ruggeri
sumber