2012-04-29 44 views
11

Tôi cần phải viết lệnh từ một thiết bị đầu cuối đến một thiết bị đầu cuối khác.linux - viết lệnh từ một thiết bị đầu cuối đến một thiết bị đầu cuối khác

tôi đã cố gắng này:

echo -e "ls\n" > /proc/pid/fd/0 
echo -e "ls\n" > /dev/pts/4 

Mà chỉ cần in ra ls như đầu ra và không thực thi.

tôi đã cố gắng này:

chmod 777 /dev/tty4 ;echo "ls" > /dev/tty4 
chmod 777 /dev/tty40 ;echo "ls" > /dev/tty40 

Mà dường như không làm bất cứ điều gì

Bất kỳ ý tưởng?

[lưu ý rằng tôi không muốn chạm vào thiết bị đầu cuối thứ hai để thực hiện việc này. chỉ cái đầu tiên]

+0

là gì bạn * thực sự * cố gắng làm gì? Nó có thể là logic của bạn để cố gắng điều này là ở nơi đầu tiên là thiếu sót; có thể có một giải pháp dễ dàng hơn để có được kết quả tương tự. Ngoài ra, các thiết bị đầu cuối chạy trong các quy trình riêng biệt, do đó bạn cần một số hình thức [truyền thông liên tiến trình] (http://en.wikipedia.org/wiki/Inter-process_communication) để giúp chúng nói chuyện với nhau. –

Trả lời

0

Đây là cách sai để thực hiện - bạn có thể hiển thị nó trong thiết bị đầu cuối nhưng không được thực thi.

Bạn sẽ cần phải làm điều gì đó như yêu cầu trình bao đọc từ một đường ống có tên hoặc từ netcat/socat. Hoặc bạn có thể thử tiêm tổ hợp phím như root hoặc sử dụng xtest (đôi khi cũng có một cách khác theo X mà tôi quên).

+0

trước hết là cảm ơn câu trả lời của bạn. im cố gắng để có được lệnh thực hiện. tại sao tôi có thể gửi stdin đến một quá trình nhưng không phải để một vỏ? .. và những gì bạn đã có nghĩa là với việc gửi tổ hợp phím? tôi có thể tiêm tổ hợp phím vào một trình bao khác không? – user1364700

2

Đây là lông. Tệp stdin trong proc bạn đang cố gắng sử dụng là một liên kết tượng trưng đến thiết bị đầu cuối (có thể là/dev/pts/something). Có hai quy trình có thiết bị mở: vỏ (mục tiêu của bạn) và trình giả lập thiết bị đầu cuối (ví dụ: gnome-terminal) và chúng sử dụng nó như một ổ cắm để truyền dữ liệu theo cả hai hướng. Có lẽ sau này là ăn cắp đầu ra và hiển thị nó, do đó, vỏ không bao giờ nhìn thấy nó. Tôi không nghĩ kĩ thuật này sẽ hoạt động.

Bạn đang cố gắng làm gì? Bạn không thể chạy quá trình như một đứa trẻ bằng cách sử dụng các công cụ thông thường như popen()? Nếu đó là trình mô phỏng thiết bị đầu cuối GUI, bạn có thể thử giả mạo đầu vào bàn phím thông qua các sự kiện X hoặc API uinput của hạt nhân.

+0

trước hết là cảm ơn câu trả lời của bạn. tôi không thể chuyển trực tiếp đầu ra cho vỏ không? thay vì giả lập thiết bị đầu cuối te? làm thế nào để có được các lệnh từ bàn phím te? tôi không thể mô phỏng nó? popen là tùy chọn ít được yêu thích của tôi. nếu viết các lệnh vào trình bao sẽ không hoạt động, tôi sẽ thử bật. – user1364700

3

Có thể hiển thị đầu ra của lệnh trên nhiều thiết bị đầu cuối cùng lúc với tập lệnh sau. Và nó hoạt động với tất cả các chương trình điều khiển, bao gồm cả trình chỉnh sửa. Ví dụ thực hiện:

execmon.bash 'nano hello.txt' 5 

mở một trình soạn thảo và cả đầu ra và văn bản mà chúng tôi giới thiệu sẽ được chuyển đến số lượng thiết bị đầu cuối ảo 5. Bạn có thể thấy thiết bị đầu cuối của bạn:

ls /dev/pts 

Mỗi thiết bị đầu cuối ảo có một số liên quan.

Làm việc với thiết bị đầu cuối bình thường, konsole và xterm, chỉ cần tạo tệp thực thi.bash và đặt này:

#!/bin/bash 
# execmon.bash 
# Script to run a command in a terminal and display the output 
# in the terminal used and an additional one. 
param = $ # 
if [$ param-eq 2]; Then 
    echo $ 1 | tee a.out a.out && cat>/dev/pts/$ 2 && exec `cat` a.out | tee/dev/pts/$ 2 && rm a.out 
else 
    echo "Usage:" 
    echo "execmon 'command' num ' 
    echo "-command is the command to run (you have to enter ')" 
    echo "-num is the number of virtual console to output to the" 
fi 

Ví dụ:

execmon.bash 'ls-l' 5 
execmon.bash 'nano Hello.txt' 5 
+0

ok., Và vì lý do này bạn cũng downvote câu trả lời của tôi., Tôi chỉ cố gắng giúp đỡ –

+1

@VoislavSauca Tôi tin rằng bỏ phiếu xuống cho câu trả lời của bạn là bởi vì nó không chính xác. –

+0

Ok, tôi cập nhật câu trả lời. –

8

Python mã:

#!/usr/bin/python 

import sys,os,fcntl,termios 
if len(sys.argv) != 3: 
    sys.stderr.write("usage: ttyexec.py tty command\n") 
    sys.exit(1) 
fd = os.open("/dev/" + sys.argv[1], os.O_RDWR) 
cmd=sys.argv[2] 
for i in range(len(cmd)): 
    fcntl.ioctl(fd, termios.TIOCSTI, cmd[i]) 
fcntl.ioctl(fd, termios.TIOCSTI, '\n') 
os.close(fd) 
+1

Điều này hoạt động độc đáo, nhưng chỉ khi bạn có quyền thích hợp cho tty có liên quan. –

1

mở 2 thiết bị đầu cuối sau đó gõ ttd trên thiết bị đầu cuối mà bạn muốn viết trên ttd sẽ chỉ cho bạn địa chỉ của thiết bị đầu cuối di chuyển đến một thiết bị đầu cuối khác và nhập cat> (địa chỉ của thiết bị đầu cuối thứ 2).210 và nhấn Enter

+0

bạn có quan tâm đến việc xây dựng + hiển thị các liên kết của những gì bạn đã có? – Roylee

-1

lệnh> dev/pts/# đó # là thiết bị đầu cuối khác của tên

+0

Tôi đoán người hỏi sẽ cố gắng thực hiện một lệnh trong một pty khác, không chỉ đặt chuỗi ở đó – SztupY

1

xem:

man 1 script 

ví dụ:

script -f /dev/tty1 
+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. – Ethaan

Các vấn đề liên quan