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.