Bir terminalin çıkışına başka bir terminalden nasıl bağlanabilirim?


44

O anda çalışan terminalin (tty1) sanal terminalinden çıkışına bağlanmalı ve onu yakalamam gerekiyor (X sunucusu çalışıyor).


5
Bazen bir komut çalıştıktan sonra başka bir mesajda içerik yakalama ihtiyacının ortaya çıktığını anlıyorum, ancak bir ons engellemenin bir pound değeri var, bu yüzden her zaman başka bir uçbirimden erişmek isteyebileceğiniz bir komutu başlatmayı screenveya kullanmaya başlamayı düşünün tmux.
13'te

Ve daha önce hazırlayabildiğiniz zaman, belki de arkadaş , internet üzerinden çalışan ve sadece yerel olmayan güzel bir aday olabilir. (ve isteğe bağlı yazabilir)
rugk

Yanıtlar:


23

Ben denilen bu araçla karşılaştım ttylog. Bu CPAN geçerli bir Perl programı burada . Birkaç uyarısı var, biri kutuma giren birinin bir parçası olarak yaratılan bir terminale nasıl bağlanacağını bulabildim. Öteki varlık, bunu yüksek ayrıcalıklarla (yani kök veya sudo) çalıştırmanız gerektiğidir.

Ama işe yarıyor!

Örneğin

İlk olarak TERM # 1’deki kutucuğuna ssh:

TERM#1% ssh saml@grinchy

Bu yeni terminalin numarasını not edin:

TERM#1% tty
/dev/pts/3

Şimdi başka bir terminalde (TERM # 2) bu komutu çalıştırın:

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]

Şimdi TERM # 1'e geri dönün ve bir şeyler yazın, bunlar TERM # 2'de görünecektir.

terminaller ss

Çalıştığım tüm komutlar (top, ls, vb.) Olayı kullanmadan çalıştı ttylog.


Tam olarak aradığımı (Geçmişte kullandım, ancak adı unuttum ve hatırlayamadım). Çok teşekkürler, geçici olarak kirli seçeneği kullandım (gdb ve çıktı çoğaltma).
pruzinat

Evet, karşılaştığım gdbilk seçenek buydu, geçmişte kendim kullandım, ama en azından benim için sakıncalı. Bunun sana yardım etmesine sevindim!
slm

1
ttylog doğru işleme eklenmiş gibi görünmüyor - herhangi biri soruma cevap verebilir: serverfault.com/questions/560972/…
LittleBobbyTables 12:03

21

Gerçekten öyle. / Dev / vcs * ve / dev / vcsa * aygıtları / dev / tty * aygıtlarına (sanal terminaller) karşılık gelir. F1 = tty1 = vcs1 / vcsa1 vb. Vcs / vcsa "geçerli" sanal terminal için tty gibidir.

Kök olarak, sadece bu aygıtları yakalayabilirsiniz (örn. Cat / dev / vcs2) ve anlık görüntü alma gibi karşılık gelen VT'de (örneğin, F2'deki / dev / tty2'deki gibi) ne olduğunu görebilirsiniz. vcsa *, terminalin boyutları (ekran) hakkında bilgi içerdiğinden vcs * 'dan farklıdır. Unutmayın, sadece ekranda göründüğü gibi karakterlerin ham bir anlık görüntüsü - terminale ayrılan hafızadan toplanmış - bu yüzden hoş, kolayca ayrıştırılabilir çıktılar beklemeyin.

Dezavantajı eğer bilgi çok hızlı bir şekilde geçmişe yanıp sönerse, yakalanması zor olabilir. Muhtemelen kuyruk -f / dev / vcs1 çalışacaktır, birkaç ekrana uymanız gerekiyorsa (kendimi denemedim)? Önce bir dosyaya yönlendirmek en kolay yol olabilir. Terminaller aynı boyutlara sahip olacağından, ona bakmak için bir VT (F1-F6) kullanmak da iyi bir fikir olabilir. Tecrübelerime göre vcsa * - cihazları kullanmamak en iyisidir.

Bu işe yaramazsa, belki de yöneticinin bir terminaldeki aktiviteye göz kulak olmasını sağlayan "büyük kardeşim" paketlerinden biri işe yarayabilir.

Not: Hangi işletim sistemini kullandığınızı sormayı unuttum. Bu Linux için, benzer cihazlar muhtemelen diğer işletim sistemlerinde de mevcut olsa da. Aygıtların kılavuz sayfaları arasında "sanal konsol belleği" aramayı deneyin.


Ssh'den tty1'e girdi enjekte etmenin bir yolu var mı? Mesela Debian çalışan bir ahududu pi ile çalışmam gerekiyor, ancak sorun şu ki, sadece bir tane USB portu var, wifi adaptörü tarafından alınmış ve fiziksel olarak bununla birlikte tty1 kullanmak için bir klavye ekleyemiyorum. Çalıştırma işlemi sırasında kapatılan bir komut dosyasını çalıştırmam gerektiğinden, wlan0aslında bu komut dosyasının başarısız olduğu yerde hata ayıklamaya çalışırken bir catch-22 durumum var. Bir usb hub'ı kullanamayacağımı varsayalım ... bir şekilde / dev / tty1'e kömür atmamın bir yolu var mı?
Steven Lu,

2
İyi. Eşyaları /dev/tty1kök olarak ekleyebiliyorum , fakat bunların hepsi ekrana karakterleri görüntülemek, girmemek.
Steven Lu

1
Üzgünüm bu sadece gürültü ise. gerçekten% 100 alakalı değil. Ama yukarıda yorumunda soruma cevap bu
Steven lu

18

bakmak:

man 1 script

Örneğin:

script -f /dev/tty1

Bunu arıyordum. screenBaşarısız tarafından takılmaya çalışıyorum sefil. İşe yarıyor.
sdkks

5

Kullan ttyonları tanımlamak için her terminal komutunu:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Bu TTY'lerin varsayıldığı gibi, ilkin stdout'unu ikinciye yönlendirmek için, bunu ilk terminalde çalıştırın:

exec 1>/dev/pts/1

Not: Şimdi her komut çıkışı pts / 1 ile gösterilecektir.

Pts / 0'ın varsayılan davranışını geri yüklemek için:

exec 1>/dev/pts/0

Bir gösteri için bu videoya bakın .


2

Bu benim için çalıştı:

  • "A" bilgisayarındaki bir klavyeyi kullanarak (yani kontrol edilecek fiziksel bilgisayar), şunları çalıştırın: screen -q

  • ssh"B" bilgisayarından "A" bilgisayarına bağlanın .

  • Ssh oturumunda şunu yazın: screen -lsbağlanılacak oturum kimliğini almak için ( tty içeren satırdaki 4 hane ).

  • Yukarıdaki komutla şununla bağlanın: screen -x <session id>... screen -lsyukarıdaki komuttan alınan oturum kimliği numarasını kullanarak .

Her iki "oturumda" da yazılan her iki "oturumda" da gerçekleşir, bu nedenle örneğin yazma screen -dBOTH oturumlarından çıkar.


1

Başka bir yaklaşım da screenyerel makinenizde gnu yardımcı programını kullanmaktır . -LSeçenekle çağırın veya bu seçenek olmadan başlayın ve ^aHkomut sırasını kullanın . Her iki yaklaşım da tüm giriş ve çıkışların, screenlog.xx'in ekran numarası olduğu bir dosyaya kaydedilmesini sağlar .

Bu kullanışlıdır, çünkü uzaktaki makineye başka bir şey kurmanız gerekmez.


1

Ekranda tty1'i başlatmadığımdan bu komut dosyası yardımcı oldu:

Yukarıdaki Baard Kopperud'un cevabını kullandım. "128", tty1’imin 1 satırı. Uyku uygun bir sayıya ayarlanabilir.

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

Bunu sonlandırıcıda kullandım ve sütunu boyutlandırdım, böylece kaydırma bir metin satırı olacaktı.


Fikir için teşekkürler, rasperryde sadece '' 'cat / dev / vcs izle' 'yapmak zorunda kaldım. Bir süreci izlemek için sanal bir konsolda' ekranı 'kullanmayı unutarak başladım. Ve sadece gnome-terminalimi ayarladım, bunu 80 karakter genişliğinde koştum.
axkibe

0

İki terminali açın. Tip ttyher birinde ve sen 's alırsınız kimliği olarak/dev/pts/nº

Sonra ilk yazdığınızda script -f /dev/pts/nºofSecondTerminalve ikinci yazarken bunun tam tersini yapın, script -f /dev/pts/nºofFirstTerminalböylece birbirleriyle bağlantı kurun.

Tebrikler! Her iki terminal de aynı şeyleri çıkarıp alıyor. Üçüncü bir ihtiyacınız var? Peki, kombinasyonları çalıştın mı? 6 script -fkomuta ihtiyacınız olacak . Daha fazla tty? Yakında...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.