Polecenie SCP z wybranym plikiem i katalogami do pobrania pyta o hasło do każdego nowego pliku lub katalogu

9

W moim systemie Fedora 20 często używam scp i po raz drugi napotykam to, kiedy uruchamiam to polecenie:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

prosi mnie o hasło do każdego przesyłanego pliku / katalogu.

user@host's password: "password here"

Pytanie:

Co tu się dzieje?

Czy to normalne, pomyślałbym, że to bardzo osobliwe zachowanie?

coś tam coś tam
źródło

Odpowiedzi:

13

Twoja lokalna powłoka (prawdopodobnie bash) się rozwija

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

w:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

Zamiast tego możesz:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

lub jeśli wiesz, że powłoka logowania użytkownika na zdalnym końcu to bash, możesz również użyć rozszerzenia nawiasów:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

aby zdalna powłoka podzieliła ciąg na argumenty zamiast powłoki lokalnej.

geirha
źródło
5

Tak, to normalne. To, co się dzieje, polega na tym, że twoja powłoka rozszerza nawiasy klamrowe przed uruchomieniem polecenia, więc to, co faktycznie uruchamiasz

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

Zasadniczo scpwidzi wiele żądań połączenia, więc otwiera nowe połączenie dla każdego z nich. JednokierunkowaNajprostszy sposób(użycie cudzysłowów sugerowanych przez @geirha jest prostsze w przypadku operacji jednorazowej). Aby rozwiązać ten problem, należy skonfigurować hasło bez hasła ssh/ scp:

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

Po jednokrotnym uruchomieniu tych dwóch poleceń (i odpowiedzi na pytania w razie potrzeby) będziesz mógł ssh/ scpbez użycia hasła dla wszystkich przyszłych połączeń ssh. Jest to i) właściwie bezpieczniejsze i ii) znacznie wygodniejsze.

terdon
źródło
+1, dobry sposób (oczywiście ssh-keygen i ssh-copy-id trzeba wykonać tylko raz). Powiedziałbym, że jest bezpieczniejszy ... tylko jeśli upewnisz się , że część prywatna jest „nieosiągalna” przez kogokolwiek poza tym użytkownikiem ... Co nie zawsze jest łatwe.
Olivier Dulac
@OlivierDulac co masz na myśli? id.rsaBędzie mieć 600uprawnienia domyślnie i sshnawet nie będzie działać, jeśli nie. Oznacza to, że jest bezpieczny dla każdego, ale rootnic nie jest naprawdę bezpieczne root, na pewno nie hasła.
terdon
Chciałem tylko dodać ten komentarz, aby osoby konfigurujące dostęp bez hasła wzięły pod uwagę (i grok) fakt, że klucz prywatny musi znajdować się w bezpiecznym środowisku i jest nieczytelny / nieudostępniony / itp. (tj. jest to łagodny sposób na podkreślenie tego, ponieważ osoby pytające mogą nie znać wszystkich konsekwencji, jakie może mieć udostępnianie / udostępnianie klucza prywatnego)
Olivier Dulac
@OlivierDulac ah, wystarczy. Nie sądzę, że warto o tym wspominać, ponieważ 1) dzieje się to automatycznie podczas używania, ssh-keygena 2) ssh / scp będzie narzekać i prosić o hasło, jeśli plik jest czytelny dla kogoś innego. Przynajmniej w systemie Linux.
terdon
4

scp nie jest zbyt mądry: gdy podano wiele argumentów wiersza poleceń, które są plikami z tego samego zdalnego hosta, otwiera nowe połączenie dla każdego argumentu.

Możesz użyć rsynczamiast scp, jest mądrzejszy w ten sposób (i na inne sposoby).

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Innym podejściem jest przekazanie jednego argumentu scpopisującego wiele plików .

Innym podejściem jest takie skonfigurowanie systemu, aby nie trzeba było cały czas uwierzytelniać. Najlepiej skonfiguruj uwierzytelnianie klucza , które w większości scenariuszy jest zarówno wygodniejsze, jak i bezpieczniejsze. Alternatywnie lub dodatkowo skonfiguruj udostępnianie połączenia , aby uwierzytelnianie odbywało się tylko raz na sesję. W każdym razie skonfiguruj alias, aby nie trzeba było podawać nazwy użytkownika i portu za każdym razem. W twoim ~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

Uruchom, ssh -Nf nickaby otworzyć połączenie, a następnie wszystkie kolejne połączenia nickprzekierują na istniejące połączenie. Teraz możesz po prostu biegać

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
Gilles „SO- przestań być zły”
źródło