Uzaktan aktif terminalde komut yürütme


10

6350 PID ile açık bir terminal emülatörünüz (T1) olduğunu varsayalım.

Başka bir terminalden şu komutu yazın (C1):

echo "ls\n" > /proc/6350/fd/0

Bu yazıyor lsve T1'deki yeni satırı çalıştırmıyor. Neden?

Ben de kullanarak çalıştı cat|bashile echo "ls\n" > /proc/catid/fd/0ama hala yürütülmez.

Komutu başka bir terminale nasıl yansıtabilir ve komutun çalıştırılmasını sağlayabilirim?

olası cevap :

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

Bu durumda, artık doğrudan terminale yazamazsınız (her şey bu terminalde komut (C1) komutunu görüntülediği şekilde görüntülenir.



Bunu okudum, ama çok yardımcı değil.
rvlander

1
Size bunu yapmanın bir yolunu verdiği gibi "yararlı" olmayabilir, ancak sorunuzu cevaplar: yapamazsınız. Bize ulaşmaya çalıştığınız son hedefi söyleyebilir ve başka bir yol olup olmadığını görebilirsiniz.
Kevin

Tamam yapamıyorsunuz ama neden metin diğer terminalde görüntüleniyor?
rvlander

çünkü metni kabuğa değil, terminal arayüzüne gönderirsiniz.
acele

Yanıtlar:


11

ttyechoBaşka bir terminale (tty / pts) komut gönderebilen ve komutun çalıştırılmasını sağlayan bir komut satırı yardımcı programı var.

sudo ttyecho -n /dev/pts/5 ls

Bakınız: Diğer Terminallere Komut veya Veri Gönderme Yardımcı Programı (tty / pts)

Ayrıca bkz: ttyechogithub kaynak kodu .

Bir başka ilginç tty komutu, selectorkonsoldaki tty giriş arabelleğini güncelleyen gerçek zamanlı etkileşimli bir kalıp eşleştiricidir.

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

Bakınız: seçici - KONSOLUNDA DİNAMİK ARAMA


Ne yazık ki, ttyechogithub'da kaynak koduna bağlantı kopmuş gibi görünüyor. Ancak, bunun yerine şimdi github.com/osospeed/ttyecho adresinde mevcut gibi görünüyor .
Wilson F

7

Eğer bir yazana zaman /dev/pts/X( /proc/6350/fd/0, 1ve 2bu sadece sembolik bağdır), ne olur tam olarak süreç ne olur aynı şeydir 6350(veya çocuklarından birinin, uygun şekilde çatallı) çıkışlar şey: terminal yazar.

Bu cihazdan ( ) okumaya çalışırsanız cat < /dev/pts/X, korkak şeyler olur. Orijinal kabuğa yazdığınız şeylerin göründüğünü görmelisiniz. (Muhtemelen sadece yazdığınız ilk yeni satırdan sonra - Terminal programının ( xtermveya kullandığınız her şeyin) bir satır arabelleğe 6350almasını tahmin ediyorum ve engellenen kabuk readbu parçayı alıyor; o zaman ya kabuk olabilir ya da olabilir değil, sonraki okumaları kazanmak, ama bu konuda tamamen yanlış olabilir.)

Mesele şu: o cihazdan okuduğunuzda veya bu cihaza yazdığınızda, onu kullanan diğer kabukla konuşmuyorsunuz. Terminal emülatörüyle konuşuyorsunuz ( xtermörneğin). Yalnızca terminal emülatörü o kanala (kabuğun okuduğu şey) veri enjekte edebilir ve kabuğun yazdığı her şey terminale gider. İkinci bir kabuk eklemek bunu değiştirmez.

Bu 6530işleme komutları enjekte etmek istiyorsanız , bunu terminal aracılığıyla yapması gerekecektir (bu bir X11 uygulaması veya başka bir şey olsun).

Önerilen okuma: 'Terminal', 'kabuk', 'tty' ve 'konsol' arasındaki kesin fark nedir?


1
İlginç bir şekilde, pts'den okumak ( cat /dev/pts/x, ihtiyacınız yok <) harfleri kesinlikle terminaller arasında değiştiriyorum.
Kevin

Yönlendirmeyi kullanmamak muhtemelen çok fazla değişmez. Her iki durumda da öngörülemeyen çıktılar alıyorum.
Mat

İlginç, bağlantı için teşekkürler. Yani terminali olan /proc/6350/fd/0stdin ebeveynine bir simlink process 6350. Pencereli uygulamalar için aynı olduğunu sanıyorum?
rvlander
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.