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?

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.


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.


+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/
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.