2012-01-31 10 views
15

W moim skrypcie powłoki uruchamiam polecenie, które prosi mnie o dane wejściowe.Czy istnieje sposób automatycznego wprowadzania danych podczas uruchamiania powłoki?

Jak mogę wydać komendę, której wejście potrzebuje automatycznie?

Na przykład:

$cat test.sh 
ssh-copy-id [email protected] 

gdy uruchomiony test.sh:

  • pierwsze, pojawi się pytanie:

    Are you sure you want to continue connecting (yes/no)?

  • Następnie poprosi mnie wprowadź hasło:

    [email protected]'s password:

Czy istnieje sposób, aby wprowadzić to automatycznie?

Odpowiedz

8

W przypadku ogólnej automatyzacji linii poleceń, klasycznym narzędziem jest Expect. Lub spróbuj pexpect, jeśli czujesz się lepiej z Pythonem.

Oto podobne pytanie sugeruje, że stosując się spodziewać: Use expect in bash script to provide password to SSH command

+0

Naprawdę powinniśmy przestać promować oczekiwanie jako sposób automatyzacji ssh. Ssh celowo sprawia, że ​​monity te są trudne do zautomatyzowania, aby skłonić nas do skorzystania z właściwych rozwiązań: flagi linii poleceń pomijają potwierdzenia i klucze publiczne/prywatne, aby wyeliminować monity o hasła. –

+1

To ideał, ale prawdziwy świat często nie jest idealny. Jeśli chodzi o postawione pytanie, jest to typowy sposób na zrobienie tego.Jeśli używałeś kluczy, prawdopodobnie też chciałbyś podać hasło do swojego klucza, a wtedy możesz znaleźć się w tej samej sytuacji. Oczywiście, możesz 'ssh-agent',' keychain', itp., Ale czasami są powody, które są niewygodne lub niepraktyczne. – jjlin

7

Tam na pewno jest ... Użyj ikry, oczekują, a także wysyłać polecenia:

Istnieje więcej przykładów całym przepełnienie stosu, zobacz: Help with Expect within a bash script

Może zaistnieć potrzeba zainstalowania tych poleceń w pierwszej kolejności, w zależności od systemu.

+0

Naprawdę powinniśmy przestać promować się jako narzędzie do automatyzacji ssh. Ssh celowo sprawia, że ​​monity te są trudne do zautomatyzowania, aby skłonić nas do skorzystania z właściwych rozwiązań: flagi linii poleceń pomijają potwierdzenia i klucze publiczne/prywatne, aby wyeliminować monity o hasła. –

14

Do prostego wejścia, jak dwa monity i dwóch odpowiednich odpowiedzi stałych, można też użyć „tutaj dokument”, której składnia wygląda tak:

test.sh <<! 
y 
pasword 
! 

The < < prefiksy wzorzec, w ta sprawa '!'. Wszystko do linii zaczynającej się od tego wzoru jest interpretowane jako standardowe wejście. To podejście jest podobne do sugestii, aby sondować echo wieloliniowe do ssh, z wyjątkiem tego, że zapisuje on fork/exec polecenia echo i uważam, że jest on nieco bardziej czytelny. Inną zaletą jest to, że używa wbudowanej funkcjonalności powłoki, więc nie zależy od oczekiwań.

+0

Odbieram, ssh wyświetla za pomocą urządzenia tty, które omija standardowe wejście. W słowach Emily Litella, "nieważne". :) –

+0

prostsze, więc najlepiej – Abid

0

ssh klucz z hasłem, z pęku kluczy

pęku kluczy to małe narzędzie, które zarządza ssh-agent w imieniu użytkownika i pozwala na ssh-agent będzie działał po zakończeniu sesji logowania. Przy kolejnych logowaniach pęku kluczy połączy się z istniejącą instancją ssh-agent. W praktyce oznacza to, że hasło należy wprowadzić tylko podczas pierwszego logowania po ponownym uruchomieniu komputera. Przy kolejnych logowaniach używany jest nieszyfrowany klucz z istniejącej instancji ssh-agent. Może to być również przydatne w przypadku zezwalania na uwierzytelnianie bez autoryzacji RSA/DSA w zadaniach cron bez bez-haseł ssh-keys.

Aby włączyć pęku kluczy, zainstaluj go i dodaj coś podobnego do ~ /.bash_profile:

eval keychain --agents ssh --eval id_rsa Z punktu widzenia bezpieczeństwa, ssh-ident i keychain są gorsze niż instancje ssh-agent, ograniczone do czasu trwania konkretnej sesji, ale oferują wysoki poziom wygody. Aby poprawić bezpieczeństwo pęku kluczy, niektórzy ludzie dodają opcję --clear do ich wywołania keychain ~/.bash_profile. Robiąc to, hasła muszą być ponownie wprowadzone przy logowaniu, jak powyżej, ale zadania cron nadal będą miały dostęp do niezaszyfrowanych kluczy po wylogowaniu użytkownika. Strona wiki pęku kluczy zawiera więcej informacji i przykładów.

Otrzymałem tę informację od;

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

Nadzieja to pomaga

osobiście był w stanie automatycznie wprowadzić moje hasło na terminalu uruchomienia w ten sposób: (można oczywiście zmodyfikować skrypt i dopasować go do swoich potrzeb)

  1. edytuj plik bashrc, aby dodać ten skrypt;

    Sprawdź, czy agent SSH jest przebudzony

    if [-z "$ SSH_AUTH_SOCK"]; następnie exec ssh-agent bash -c "ssh-add; $ 0" echo "Agent SSH obudził" wyjście fi

    Powyższa linia rozpocznie skrypt oczekiwać momencie uruchomienia terminala.

    ./ssh.exp

oto treść tego oczekiwać skrypt

#!/usr/bin/expect 

set timeout 20 

set passphrase "test" 

spawn "./keyadding.sh" 

expect "Enter passphrase for /the/path/of/yourkey_id_rsa:" 

send "$passphrase\r"; 

interact 

Oto treść mojego skryptu keyadding.sh (należy umieścić zarówno skrypty w katalogu domowym, zazwyczaj/home/user)

#!/bin/bash 

ssh-add /the/path/of/yourkey_id_rsa 

exit 0 

Gorąco sugerują szyfrowanie pa ssword w skrypcie .exp oraz zmiana nazwy tego pliku .exp na coś takiego jak term_boot.exp lub cokolwiek innego ze względów bezpieczeństwa. Nie zapomnij o utworzeniu plików bezpośrednio z terminalu za pomocą nano lub vim (np. nano ~/.bashrc | nano term_boot.exp), a także chmod +x script.sh, aby był on wykonywalny. Użyteczna byłaby także opcja chmod +r term_boot.exp, ale musisz dodać sudo przed ./ssh.exp do pliku bashrc. Musisz więc wpisać swoje hasło sudo przy każdym uruchomieniu terminalu. Dla mnie jest to wygodniejsze niż hasło, bo pamiętam hasło administratora (sudo) przy palenisku.

Ponadto, jest to inny sposób, aby to zrobić, myślę; https://www.cyberciti.biz/faq/noninteractive-shell-script-ssh-password-provider/

Z pewnością zmieni moją metodę na tę, kiedy będę miał czas.

Powiązane problemy