2012-08-02 12 views
6

Zastanawiam się, jak tworzyć ruręrura linux z wielu programów z prośbą o dane wprowadzone przez użytkownika

program 1 | ... | program N 

gdzie wielokrotnością programów poprosić o dane wprowadzone przez użytkownika. Problem polega na tym, że | uruchamia programy równolegle i w ten sposób rozpoczynają odczytywanie równolegle z terminala.

W takich przypadkach użyteczne byłoby posiadanie rury |, która uruchamia program (i + 1) tylko po tym, jak program i wygenerował pewną wydajność.

Edit:

Przykład:

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

Tutaj zarówno gpg -c jak ssh poprosić o hasło.

Rozwiązaniem tego konkretnego przykładu byłoby utworzenie par kluczy ssh, ale nie jest to możliwe w każdym systemie i zastanawiałem się, czy istnieje ogólne rozwiązanie. Również gpg pozwala na przekazanie hasła jako argumentu wiersza poleceń, ale nie jest to sugerowane ze względów bezpieczeństwa.

+1

Po podłączeniu program do rury, to dostaje swoje wejście z innego programu, a nie użytkownika. Czy na pewno chcesz rurę? Nie mogę myśleć o programie, który zarówno pobiera dane wprowadzane przez użytkownika *, jak i * ze standardowego wejścia. – chepner

+0

Nie jest to odpowiedź, ale pomysł, który może wskazać ci właściwy kierunek: Czy możesz dołączyć kod do każdego programu, aby sprawdzić wynik dla określonego ciągu, aktualizując flagę, która została znaleziona i posiadającą inne pętle połączeń, aż do wyświetlenia flagi poprzedniego programu zaktualizowany, a następnie pozwolić im działać? – JohnLBevan

+2

Pokaż konkretny przykład tego zdarzenia. Program mógł czytać z 'stdin' i'/dev/tty', ale byłoby to niezwykłe. –

Odpowiedz

1

Można użyć tej budowy:

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

na przykład:

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

Tutaj 1, 2 i 3 zostały wpisane z klawiatury; cat is started został napisany przez echo.

Zawartość file po wykonaniu polecenia:

$ cat file 
1 
2 
3 
0

jednego można dać gpg hasło z opcją --passphrase.

Dla ssh najlepszym rozwiązaniem jest logowanie przy użyciu klucza. Ale jeśli musisz zrobić to za pomocą hasła, polecenie expect będzie dobre. Oto dobry przykład: Use expect in bash script to provide password to SSH command

Oczekiwanie pozwala również na pewne dane wejściowe - więc jeśli nie chcesz na twardo kodować hasła, może to być droga.

1

Jestem teraz używając:

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

Pierwszy sudo uniemożliwi drugi z prośbą hasło ponownie. Jak zasugerowano powyżej, read odracza rozpoczęcie ssh. Użyłem -n 1 dla read, ponieważ nie chcę czekać na nową linię, a -n dla echo, aby uciszyć znak nowej linii.

+1

'sudo -v' wydłuży czas oczekiwania, monitując o hasło, jeśli jeszcze go nie sprawdziłeś. Pozwala to uniknąć konieczności wymyślania dodatkowego polecenia ('echo" Jestem rootem! ")') Do uruchomienia. – chepner

0

Potrzebowałem czegoś podobnego kilka razy wcześniej, gdzie pierwsze polecenie w potoku wymaga podania hasła, a następne polecenie nie obsługuje tego automatycznie (podobnie jak robi to metoda less).

podobne do odpowiedzi Igora, znaleźć zastosowanie czytać wewnątrz podpowłoce przydatne:

cmd1 | (read; cat - | cmd2) 
Powiązane problemy