Gửi lệnh đến màn hình tách ra và nhận đầu ra


12

Tôi đã tìm kiếm một cách để gửi lệnh đến một phiên màn hình tách ra. Càng xa càng tốt. Đây là những gì tôi nghĩ ra:

$ screen -S test -p 0 -X stuff 'command\n'

Lệnh này hoạt động như bình thường. Nhưng, tôi cũng muốn đầu ra từ nó, vang thẳng trước mắt tôi (không cần .logtập tin hay cái gì đó, tôi chỉ muốn đầu ra).

Sử dụng screen -Llệnh, không phải là một lựa chọn.


Tại sao nó phải như screenvậy? Đây không phải là những gì các quá trình con được thực hiện cho?
Anko

Câu trả lời:


10

Sử dụng một ống đầu tiên ra trước:

mkfifo /tmp/test

Sử dụng một toán tử chuyển hướng. Chuyển hướng đầu ra của lệnh sang / tmp / test chẳng hạn như thế này:

screen -S test -p 0 -X stuff 'command >/tmp/test\n'

Sau đó trong một vỏ khác

tail -f /tmp/test.

Lưu ý bạn cũng có thể muốn chuyển hướng các thông báo lỗi bằng cách sử dụng toán tử 2> & 1 .

Thí dụ

Theo yêu cầu trong các nhận xét, giả sử chúng ta có tập lệnh php chấp nhận đầu vào của người dùng và in tải máy chủ trên đầu vào của "trạng thái":

# cat test.php
<?php
  $fp=fopen("php://stdin","r");
  while($line=stream_get_line($fp,65535,"\n")) 
  {
    if ($line=="status") {echo "load is stub";} 
  } 
  fclose($fp);
?>

Bạn tạo hai fifos:

 # mkfifo /tmp/fifoin /tmp/fifoout

Bạn gọi một màn hình:

screen

Trong bảng điều khiển khác, hãy gọi nó là bàn điều khiển 2 bạn tìm ra tên màn hình của mình:

# screen -ls
There is a screen on:
        8023.pts-3.tweedleburg  (Attached)
1 Socket in /var/run/screens/S-root.

Trong giao diện điều khiển 2, bạn gửi lệnh đến màn hình:

 # screen -S 8023.pts-3.tweedleburg -p 0 -X stuff 'php test.php </tmp/fifoin >/tmp/fifoout\n'

bạn thấy lệnh xuất hiện trên màn hình. Bây giờ trong giao diện điều khiển 2, bạn có thể gửi lệnh đến quy trình php của mình:

echo "status" >/tmp/fifoin

và đọc từ nó:

# cat /tmp/fifoout
load is stub

1
Xin lỗi, nhưng điều này không hoạt động. Nếu tôi đang gửi một lệnh đến creen như 'lệnh> / tmp / test' thì quá trình phải hỗ trợ cú pháp> / tmp / test ... Và nó không.
Robin

Đối với tôi nó hoạt động, xin lưu ý rằng tôi đặt "test" làm tên màn hình của bạn. Bạn có thể tìm ra tên màn hình của mình bằng màn hình lệnh -ls. Ngoài ra, "lệnh" nên được thay thế bằng lệnh thực tế của bạn, tôi đã thử nghiệm với lệnh ls. Ngoài ra, tôi đã thử nghiệm với bash shell.
Thorsten Staerk

Tôi biết điều đó. Và nó không hoạt động. Ví dụ, bắt đầu một tập lệnh PHP trong một cửa sổ màn hình, ví dụ, đáp ứng với một "trạng thái" lệnh, trả về tải máy chủ hiện tại chẳng hạn. Đó là những gì tôi đang cố gắng làm.
Robin

sau đó bạn sẽ cần các ống hai chiều, tôi sẽ thêm câu này vào câu trả lời của tôi
Thorsten Staerk

6

Tôi có một tập lệnh python theo dõi nhiều phiên màn hình tách rời và thu được đầu ra từ mỗi (khi các lệnh sử dụng như free, top -bn2, iuler được định kỳ gửi qua 'Stuff').

Thay vì chuyển hướng đến một tệp và do đó, quản lý ít nhất một tệp cho mỗi phiên màn hình tách rời ... Tôi chỉ cần chuyển hướng đến bất kỳ tty / pts nào mà phiên cha mẹ tôi đang sử dụng.

Bước # 1: Bắt đầu một phiên màn hình mới (với tên người có thể đọc được) ở chế độ tách rời.

$ screen -dmS chad 

Bước # 2: Gửi lệnh của bạn (Tôi sẽ sử dụng lệnh 'free -g' cùng với 'uname -r') thông qua công cụ. Điều quan trọng là chỉ định cửa sổ mà bạn muốn sử dụng (trong trường hợp của chúng tôi, cửa sổ đầu tiên và duy nhất) với -p.

$ screen -r chad -p0 -X stuff "free -g; uname -r" 

Bước # 3: Bước trên chỉ gửi văn bản lệnh. Chúng tôi cũng cần phải gửi một trở lại vận chuyển đến phiên màn hình tách ra này để shell thực hiện lệnh của chúng tôi. Ký tự ASCII 015 là tiền hoàn trả trên hầu hết các hệ thống * nix.

$ screen -r chad -p0 -X eval "stuff \015"

Bước # 4: Chuyển hướng đầu ra của phiên màn hình tách rời sang tty / pts hiện tại của chúng tôi:

$ screen -r chad -p0 -X hardcopy $(tty)

Đầu ra của Bước # 4 sẽ trông giống như thế này:

$ free -g; uname -r
             total       used       free     shared    buffers     cached
Mem:             7          1          6          0          0          0
-/+ buffers/cache:          0          7
Swap:            1          0          1
2.6.32-358.el6.x86_64

Mặc dù điều này có vẻ hơi liên quan, quá trình này dễ dàng được kịch bản. Với python, tôi có thể phân tích đầu ra của Bước # 4 và chỉ thu thập dữ liệu mà tôi quan tâm.

Chọn một kịch bản đơn giản như lấy chi tiết IP, tôi đã viết một kịch bản ví dụ để thể hiện các khái niệm ở trên. Hãy thay thế và tinker khi bạn thấy phù hợp.

Ví dụ tập lệnh python để lấy chi tiết IP từ phiên màn hình tách rời:

#!/usr/bin/python

import pexpect, time

#spawn a new bash session
session = pexpect.spawn('/bin/bash')
#send screen commands
session.sendline('screen -dmS netIP')
session.sendline('screen -r netIP -p0 -X stuff "ifconfig eth0 | grep -v eth0 | head -1"')
session.sendline('screen -r netIP -p0 -X eval "stuff \\015"')
#give the command a chance to execute before reading the output of our detached screen
time.sleep(0.1)

#use the output of the uname command as our string to expect
session.sendline('screen -r netIP -p0 -X hardcopy $(tty); $(uname)')
session.expect('Linux')

#parse the output - only concerned with the 'inet' line
output = session.before.split('\n')
for o in output:
    if 'inet' in o:
        print o

#kill the screen
session.sendline('screen -r netIP -p0 -X quit')
time.sleep(0.1)

session.close()

Kịch bản trên đang hoạt động:

$ python screen-output-test.py 
      inet addr:192.168.1.201  Bcast:192.168.1.255  Mask:255.255.255.0

Tôi thích câu trả lời này tốt hơn nhiều so với câu trả lời được chấp nhận, vì nó không dựa vào màn hình ở trạng thái "shell prompt", nhưng cũng hoạt động với bất cứ thứ gì đang chạy trong màn hình đó.
Guntram Blohm hỗ trợ Monica

Tuy nhiên, nó yêu cầu đầu ra để vừa với màn hình. Tôi tìm thấy screen -X logfile /tmp/something; screen -X log on; screen -X stuff "command param"; screen -X log offđể làm việc tốt hơn trong kịch bản đó.
Guntram Blohm hỗ trợ Monica

-1
screen -S myscreen

screen -R myscreen -X exec command

Thí dụ:

screen -R myscreen -X exec top
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.