2013-02-28 50 views
0

我寫了一個shell腳本,它要求從標準輸入中輸入用戶名和密碼。 一旦輸入用戶名和密碼,就會有一個輸出取決於腳本中傳遞的參數。在提示用戶輸入的腳本中使用grep

說我的腳本名稱是XYZ.ksh。

現在我的問題是,這些腳本的用戶希望使用要在結合使用這個腳本與其他shell命令一樣grep的,更小,更,廁所等

通常是他們可以使用

XYZ.ksh | grep abc 

但在我的情況下,由於XYZ提示輸入用戶名和密碼,我們無法使用「|」在那之前。它永遠阻止。

我只是想知道我該如何實現功能性。

我試過 我試圖從用戶那裏就像用戶類型的東西採取「多個命令」中輸入「| grep的ABC」 但是當我在我的腳本中使用此輸入也沒有工作。

回答

0

使用<<<這樣的:

XYZ.ksh <<< "your inputs" | grep abc 
+0

是的,我想到了這一點,但問題是我不希望用戶輸入密碼,它不應該是可見的,這就是爲什麼我提示用戶在腳本本身的密碼。 – 2013-02-28 13:09:21

0

在你的腳本,你可以測試一下,看看是否標準輸出連接到終端有:

if [[ -t 1 ]] 

這樣,如果輸出你可以禁止提示不會去控制檯。 或者,使用「更多命令」解決方案,運行連接到命名管道的命令。

0

有常用的這類問題多種解決方案,但沒有一種是完美的:

  • 從標準輸入讀取密碼。它使得在管道中使用腳本非常困難。處理更改密碼的命令使用此方法:passwd,smbpasswd
  • 在命令行參數中提供用戶名和密碼。此解決方案適用於在管道中使用腳本,但任何人都可以查看命令行,例如使用ps -ef。這用於mysql,htpasswd,sqlplus,...
  • 將用戶名和密碼未加密存儲在用戶主目錄中的文件中。此解決方案適用於在管道中使用腳本,但腳本必須檢查該文件是否可見或可由其他用戶修改。這用於mysql
  • 將私鑰存儲在遠程文件的本地文件和公鑰中,正如SSH所使用的。您必須具備良好的加密知識才能正確執行此操作(或依賴於SSH)​​,但它非常適合在管道中使用,甚至可以在不同的機器上創建管道!
  • 不要處理密碼,並假定如果用戶在系統中登錄,他有權運行該程序。您可以僅向一個組授予執行權限,以過濾可以使用該程序的人員。這是由來自Oracle,VirtualBox的sqlplus,某些Linux發行版上的遊戲,...

我的首選解決方案是最後一個,因爲系統肯定比我可以編寫的關於安全性的任何程序都要好。

如果密碼用於登錄其他服務,那麼我可能會去包含密碼的私人文件。

0

一個不太理想的可能性是將提示顯示爲stderr而不是stdout

echo -n "Username:" >/dev/stderr 

更好的解決方案是檢查shell的stdin。如果它是一個終端,然後打開它寫入並重定向到該文件。不幸的是,我不知道如何在bash或ksh中做到這一點。或許像

echo -n "Username:" >/dev/tty 
0

可以使用(我假設你正在閱讀的用戶名和密碼在你的腳本read

(
    read -p "user:" USER 
    read -p "pass:" PASS 
) </dev/tty> /dev/tty 

,你就可以運行

$ cmd | XYZ.ksh 

但是,我同意其他答案:只是不要求用戶和密碼,並給予腳本的正確權限以允許訪問。