Команда 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

Ваша локальная оболочка (вероятно, bash) расширяется

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паролей.
Terdon

Я просто хотел добавить этот комментарий, чтобы люди, настраивающие доступ без пароля, принимали во внимание (и впрямь) тот факт, что закрытый ключ должен быть в безопасной среде и нечитаемым / неразделенным / и т.д. (т. е. это мягкий способ указать на это, поскольку спрашивающие могут не знать всех последствий, которые мог иметь доступ к секретному ключу / предоставление ему доступа)
Оливье Дюлак

@ 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.