2012-08-02 48 views
6

的Linux管我不知道如何創建一個管道與多個程序要求用戶輸入

program 1 | ... | program N 

在程序的多個要求用戶輸入。問題是|並行啓動程序,因此它們開始從終端並行讀取。

對於這樣的情況,只有在程序i產生了一些輸出後,纔有一個管道|啓動程序(i + 1)會很有用。

編輯:

例子:

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

這裏既有gpg -c以及ssh詢問密碼。

對於這個特定的例子,一個解決方法是創建ssh密鑰對,但這在每個系統上都是不可能的,我想知道是否有一個通用的解決方案。 此外,gpg允許將口令作爲命令行參數傳遞,但出於安全原因不建議這樣做。

+1

一旦一個程序連接到一個管道,它從另一個程序,而不是用戶的輸入。你確定你想要一個管道嗎?我無法真正想到一個程序,它們都需要用戶輸入*和*從標準輸入讀取。 – chepner 2012-08-02 22:32:23

+0

不是一個答案,而是一個可能指向正確方向的想法:是否可以在每個程序周圍包含代碼,以檢查特定字符串的輸出,更新一次發現的標誌並讓其他調用循環直到前一個程序的標誌爲止更新,然後讓他們跑? – JohnLBevan 2012-08-02 22:53:00

+2

顯示這種情況的具體示例。一個程序可以從'stdin'和'/ dev/tty'中讀取,但這是不常見的。 – 2012-08-03 01:01:44

回答

1

您可以使用此結構:

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

例如:

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

這裏123從鍵盤輸入; cat is started是由echo編寫的。

file內容的命令執行後:

$ cat file 
1 
2 
3 
0

一個你可以給與--passphrase選項GPG密碼。

對於ssh 最佳解決方案將通過密鑰登錄。但如果你需要通過密碼來做expect命令將會很好。這裏有一個很好的例子:Use expect in bash script to provide password to SSH command

期望也允許你有一些輸入 - 所以如果你不想硬編碼你的密碼這可能是一條路。

1

我現在使用:

#!/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') 

第一sudo將防止第二再次詢問密碼。如上所示,read推遲ssh的開始。我使用-n 1代替read,因爲我不想等換行符,而-n代替echo來壓制換行符。

+1

'sudo -v'會延長超時時間,如果你還沒有驗證,提示輸入密碼。這可以讓你避免必須拿出一個無關的命令('echo「I root!」')來運行。 – chepner 2013-02-26 17:26:52

0

我以前需要類似的東西,在管道中的第一個命令需要輸入密碼,並且下一個命令不會自動迎合此(類似於less所做的那樣)。

伊戈爾的反應類似,我發現使用的有用子shell裏面寫着:

cmd1 | (read; cat - | cmd2) 
相關問題