Jalankan perintah di terminal aktif jarak jauh

10

Misalkan Anda memiliki terminal emulator (T1) terbuka dengan PID 6350.

Dari terminal lain, ketikkan perintah ini (C1):

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

Ini menulis lsdan baris baru di T1 tetapi tidak menjalankannya. Mengapa?

Saya juga mencoba menggunakan cat|bashdengan echo "ls\n" > /proc/catid/fd/0tetapi masih belum dieksekusi.

Bagaimana saya bisa mengulang perintah ke terminal lain dan menjalankan perintah?

kemungkinan jawaban:

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

Dalam hal ini Anda tidak dapat menulis lagi secara langsung di terminal (semuanya ditampilkan dengan cara yang sama dengan perintah (C1) yang ditampilkan di terminal ini.

rvlander
sumber
Saya membaca itu, tetapi tidak terlalu membantu.
rvlander
1
Ini mungkin tidak "berguna" karena memberi Anda cara untuk melakukannya, tetapi itu menjawab pertanyaan Anda: Anda tidak bisa. Anda bisa memberi tahu kami tujuan akhir yang ingin Anda capai dan melihat apakah ada cara lain.
Kevin
Ok Anda tidak bisa tidak mengapa mengapa teks ditampilkan di terminal lain?
rvlander
karena Anda mengirim teks ke antarmuka terminal, bukan ke shell.
buru

Jawaban:

11

Ada utilitas baris perintah yang disebut ttyechoyang dapat mengirim perintah ke terminal lain (tty / pts) dan menjalankan perintah.

sudo ttyecho -n /dev/pts/5 ls

Lihat: Utilitas untuk Mengirim Perintah atau Data ke Terminal Lain (tty / pts)

Lihat juga: ttyechokode sumber di github .

Perintah tty lain yang menarik adalah selector, pencocokan pola interaktif real-time di konsol yang memperbarui buffer input tty.

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

Lihat: pemilih - PENCARIAN DINAMIS DI KONSOL

chad
sumber
Sayangnya, tautan ke ttyechokode sumber di github tampaknya rusak. Namun, sekarang tampaknya tersedia di github.com/osospeed/ttyecho .
Wilson F
7

Ketika Anda mengeluarkan tulisan ke /dev/pts/X( /proc/6350/fd/0, 1dan 2hanya merupakan symlink ke sana), apa yang terjadi adalah hal yang persis sama yang terjadi ketika proses 6350(atau salah satu dari anak-anaknya, yang bercabang-cabang) menghasilkan sesuatu: ia menulis ke terminal.

Jika Anda mencoba membaca dari perangkat itu ( cat < /dev/pts/X), hal-hal yang funky akan terjadi. Anda harus melihat hal-hal yang Anda ketik di shell asli muncul. (Sangat mungkin hanya setelah baris baru pertama yang Anda ketikkan - Saya menduga program terminal ( xtermatau apa pun yang Anda gunakan) melakukan beberapa penyangga baris, dan 6350shell yang diblokir readakan mendapatkan bagian itu; kemudian shell mungkin, atau mungkin tidak, menangkan bacaan selanjutnya, tapi saya mungkin sangat salah tentang hal ini.)

Masalahnya adalah: ketika Anda membaca dari atau menulis ke perangkat itu, Anda tidak berbicara dengan shell lain yang menggunakannya. Anda sedang berbicara dengan terminal emulator ( xtermmisalnya). Hanya emulator terminal yang dapat menyuntikkan data ke saluran tersebut (apa yang dibaca shell), dan semua yang ditulis shell masuk ke terminal. Memasang shell kedua tidak mengubah itu.

Jika Anda ingin menyuntikkan perintah ke dalam 6530proses itu, itu harus dilakukan melalui terminal (apakah itu aplikasi X11 atau yang lainnya).

Bacaan yang disarankan: Apa perbedaan persis antara 'terminal', 'shell', 'tty' dan 'konsol'?

Tikar
sumber
1
Menariknya, membaca dari Poin ( cat /dev/pts/x, Anda tidak perlu <) Saya mendapatkan surat ketat bergantian antara terminal.
Kevin
Tidak menggunakan pengalihan mungkin tidak banyak berubah. Saya mendapatkan output yang tidak dapat diprediksi.
Mat
Menarik, terima kasih atas tautannya. Begitu /proc/6350/fd/0juga simlink ke orang tua stdin process 6350yang merupakan terminal. Saya kira itu sama untuk aplikasi berjendela?
rvlander