2012-08-02 27 views
6

Tôi tự hỏi làm thế nào để tạo ra một ốngống linux với nhiều chương trình yêu cầu người dùng nhập vào

program 1 | ... | program N 

nơi nhiều trong những chương trình yêu cầu người dùng nhập vào. Vấn đề là | bắt đầu các chương trình song song và do đó chúng bắt đầu đọc từ thiết bị đầu cuối song song.

Đối với các trường hợp như vậy, sẽ hữu ích khi có đường ống | bắt đầu chương trình (i + 1) chỉ sau khi chương trình tôi đã tạo ra một số đầu ra.

Edit:

Ví dụ:

cat /dev/sda | bzip2 | gpg -c | ssh [email protected] 'cat > backup' 

đây cả gpg -c cũng như ssh yêu cầu một mật khẩu.

Giải pháp cho ví dụ cụ thể này là tạo cặp khóa ssh, nhưng điều này là không thể trên mọi hệ thống và tôi đã tự hỏi liệu có giải pháp chung hay không. Ngoài ra gpg cho phép cụm từ mật khẩu được chuyển thành đối số dòng lệnh, nhưng điều này không được đề xuất vì lý do bảo mật.

+1

Khi bạn kết nối một chương trình để một đường ống, nó được đầu vào của nó từ một chương trình khác, không phải là người sử dụng. Bạn có chắc bạn muốn một đường ống? Tôi thực sự không thể nghĩ ra một chương trình mà cả hai đều có đầu vào của người dùng * và * đọc từ đầu vào tiêu chuẩn. – chepner

+0

Không phải là câu trả lời, nhưng có thể đưa bạn đi đúng hướng: Bạn có thể bao gồm mã xung quanh mỗi chương trình để kiểm tra đầu ra cho một chuỗi cụ thể không, cập nhật cờ khi tìm thấy và có vòng lặp cuộc gọi khác cho đến khi lá cờ của chương trình trước đó được cập nhật, sau đó cho phép chúng chạy? – JohnLBevan

+2

Hiển thị ví dụ cụ thể về sự cố này. Một chương trình có thể đọc từ 'stdin' và từ'/dev/tty', nhưng điều này sẽ không bình thường. –

Trả lời

1

Bạn có thể sử dụng xây dựng này:

(read a; echo "$a"; cat) > file 

Ví dụ:

$ (read a; echo "$a"; echo cat is started > /dev/stderr; cat) > file 
1 
cat is started 
2 
3 

Đây 1, 23 được nhập từ bàn phím; cat is started được viết bởi echo.

Nội dung file sau khi thực hiện lệnh:

$ cat file 
1 
2 
3 
0

cho một bạn có thể cho GPG mật khẩu với các tùy chọn --passphrase.

Đối với ssh, giải pháp tốt nhất là đăng nhập bằng khóa. Nhưng nếu bạn cần làm bằng mật khẩu, lệnh expect sẽ tốt. Dưới đây là một ví dụ tốt: Use expect in bash script to provide password to SSH command

Mong đợi cũng cho phép bạn có một số đầu vào - vì vậy nếu bạn không muốn mã hóa mật khẩu của mình thì đây có thể là cách để thực hiện.

1

bây giờ tôi đang sử dụng:

#!/bin/bash 
sudo echo "I am root!" 
sudo cat /dev/disk0 | bzip2 | gpg -c | (read -n 1 a; (echo -n "$a"; cat) | ssh [email protected] 'cat > backup') 

Các sudo đầu tiên sẽ ngăn thứ hai từ yêu cầu mật khẩu một lần nữa. Như đã đề xuất ở trên, các read trì hoãn sự khởi đầu của ssh. Tôi đã sử dụng -n 1 cho read vì tôi không muốn đợi dòng mới và -n cho echo để nhấn dòng mới.

+1

'sudo -v' sẽ kéo dài thời gian chờ, nhắc mật khẩu nếu bạn chưa được xác thực. Điều này cho phép bạn tránh phải đưa ra một lệnh không liên quan ('echo" Tôi là root! "') Để chạy. – chepner

0

Tôi cần một vài thứ tương tự trước đây, khi lệnh đầu tiên trong đường dẫn yêu cầu nhập mật khẩu và lệnh tiếp theo không tự động phục vụ cho việc này (như cách mà less thực hiện).

Tương tự như phản ứng của Igor, tôi thấy việc sử dụng đọc bên trong một subshell hữu ích:

cmd1 | (read; cat - | cmd2) 
Các vấn đề liên quan