Команда SCP з вибраним файлом та каталогами для завантаження запитує пароль для кожного нового файлу чи каталогу


9

У своїй системі Fedora 20 я дуже часто використовую scp, і це вже вдруге, коли я запускаю цю команду:

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

він запитує у мене пароль для кожного файлу / каталогу, який він передає.

user@host's password: "password here"

Питання:

Що тут відбувається?

Це нормально, я думаю, це дуже своєрідна поведінка?

Відповіді:


13

Ваша локальна оболонка (ймовірно, баш) розширюється

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

в:

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

Натомість ви можете:

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/

або, якщо ви знаєте, що оболонка входу користувача на віддаленому кінці є bash, ви також можете використовувати розширення дужок:

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

щоб віддалена оболонка розділила рядок на аргументи замість локальної оболонки.


5

Так, це нормально. Що відбувається, це те, що ваша оболонка розширює дужки перед тим, як запустити команду

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

В основному, scpбачить кілька запитів на з'єднання, тому відкривається нове з'єднання для кожного з них. ОдностороннійНайпростіший спосіб(використовувати лапки, запропоновані @geirha, простіше для разової операції), щоб вирішити це - встановити без пароля ssh/ scp:

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

Запустивши ці дві команди один раз (і відповівши на підказки за потреби), ви зможете ssh/ scpбез використання пароля для всіх майбутніх з'єднань ssh. Це i) насправді більш безпечно і ii) набагато зручніше.


+1, хороший спосіб (звичайно, ssh-keygen & ssh-copy-id потрібно зробити лише один раз). Я б сказав, що це більш безпечно ... лише якщо ви переконаєтесь , що приватна частина "недоступна" ким-небудь, крім цього користувача ... Що не завжди просто.
Олів'є Дулак

@OlivierDulac, що ти маєш на увазі? За замовчуванням id.rsaматимуть 600дозволи та sshнавіть не працюватиме, якщо цього не буде. Це означає, що він захищений від будь-кого, але rootнічого, насправді, не захищене від rootпаролів.
тердон

Я просто мав намір додати цей коментар, щоб люди, які встановлювали доступ без пароля, враховували (і grok) той факт, що приватний ключ повинен знаходитись у безпечному середовищі та нечитабельному / нерозбірливому / тощо. (тобто, це щадний спосіб вказати на це, оскільки ті, хто запитує, можуть не знати всіх наслідків, якими може ділитися / надати приватний ключ, доступний)
Олів'є Дулак

@OlivierDulac ах, досить справедливо. Я не вважав, що це варто згадувати, тому що 1) це відбувається автоматично при використанні, ssh-keygenі 2) ssh / scp поскаржиться і попросить пароль, якщо файл читається ще ким-небудь. Принаймні, на Linux все одно.
terdon

4

scp не дуже розумно: коли дано кілька аргументів командного рядка, які є файлами з одного віддаленого хоста, він відкриває нове з'єднання для кожного аргументу.

Ви можете використовувати rsyncзамість цього scp, це розумніший спосіб (та іншими способами).

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

Інший підхід - передавати єдиний аргумент, scpякий описує кілька файлів .

Інший підхід полягає в тому, щоб налаштувати вашу систему так, що вам не доведеться постійно проводити автентифікацію. Переважно, встановіть аутентифікацію ключів , яка в більшості сценарії є і зручнішою, і безпечнішою. Крім того, або, крім того, налаштуйте спільний доступ до з'єднання , так що вам потрібно лише один раз за сеанс аутентифікуватись. У будь-якому випадку, встановіть псевдонім, щоб вам не потрібно було щоразу вказувати ім’я користувача та порт. У вашому ~/.ssh/config:

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

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

Запустіть, ssh -Nf nickщоб відкрити з'єднання, і тоді всі наступні підключення до nickнакопичувача на існуючому з'єднанні. Тепер ви можете просто бігти

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.