44

Если я хочу отправить что-то через scp на сервер:

$ scp file server:
                   _____  _____  _____
$

, затем печатаются три строки и файл не копируется. Однако я могу подключиться к серверу через SSH без проблем:

$ ssh server

Как заставить работать scp?

6 ответов6

60

Одной из возможных причин такого типа поведения является распечатка любого сообщения во время процесса входа на сервер. Scp зависит от ssh для обеспечения полностью прозрачного зашифрованного туннеля между клиентом и сервером.

Проверьте все сценарии входа на сервер, а также попробуйте использовать другого пользователя. Еще один метод определения источника ошибки - использовать -v в команде, чтобы отслеживать ход транзакции и видеть, где она терпит неудачу. При необходимости вы можете использовать до -vvv для увеличения многословия. Проверка различных форм scp также может быть поучительной, как указано в посте InChargeOfIT.

Под капотом scp устанавливает туннель с помощью ssh, а затем передает файл по этому туннелю с помощью команды ssh на дальнем конце, чтобы перехватить файл при его получении. Это иллюстрируется использованием tar и ssh для копирования структуры каталогов с сохранением времени владения и создания с помощью следующих команд:

  tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

отправить его и

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

чтобы вернуть это.

46

Проверьте .bashrc целевого пользователя или эквивалентный файл. ~/.bashrc получен для неинтерактивных входов в систему. Если есть эхо или команда, которая что-либо выводит, это нарушит протокол SCP.

13

Редактировать: Вы уверены, что вводите правильный путь в команде scp? Например:

scp test.txt username@remoteserver.com

потерпит неудачу (фактически, она просто выведет команду, как вы видите). В этом случае вам нужно будет указать действительный путь к удаленному серверу. Например, scp test.txt username@remoteserver.com:~/

Пример использования:

Отправить файл:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

Получить файл:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

Примеры:

Отправьте файл с рабочего стола в мою домашнюю папку на удаленном сервере:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

Помните, ~ это ярлык для вашего домашнего каталога ... например, /home /

Отправьте файл в webroot:

scp ~/Documents/working/index.html john_doe@johndoe.com:/var/www/index.html

В этом примере пользователю john_doe потребуются права на запись в каталог remote /var /www.

0

Это не дает прямого ответа на вопрос, но может быть полезно для таких людей, как я, ищущих решение с зависанием scp при передаче файлов между двумя удаленными хостами.

Если scp зависает из-за сообщений от ssh, он может помочь устранить их:

scp -o "StrictHostKeyChecking no"

и / или

scp -B

От scp man:

-B Выбирает пакетный режим (запрещает запрашивать пароли или парольные фразы).

-o ssh_option Может использоваться для передачи параметров в ssh в том формате, в котором нет отдельного флага командной строки scp. Для получения полной информации о параметрах, перечисленных ниже, и их возможных значениях, смотрите ssh_config (5).

В моем случае это, казалось, помогло, но не решило всей проблемы. Мы не смогли выяснить, почему зависает scp при переносе с удаленного на удаленный. Он висел в середине файла. 9 раз сработало, попытка № 10 не сработала. Мы подозревали, что это может быть зависание, когда наше VPN-соединение на мгновение получает скачок трафика, а затем scp не восстанавливается. Он действительно просто навсегда зависает и даже не выдает сообщение об ошибке.

Однако я сдался и переключился на sftp. Это значительно быстрее, так как используется прямое соединение между удаленными хостами. Вы должны включить

Host example.com
    AgentForward yes

в файле ~/.shh/config компьютера, на котором запущен скрипт. Конечно, это только решение, если оба удаленных компьютера находятся в вашей доверенной сети.

0

На некоторых хостах они неправильно .bash_profile для неинтерактивных логинов, таких как scp. Сообщения, которые печатаются на терминал, могут привести к неправильной работе scp . Если у вас есть сообщения в вашем .bash_profile это может быть причиной.

Чтобы по-прежнему отображать ваши сообщения для входа в систему, баннер и т.д. В интерактивных учетных записях и при этом использовать scp через неинтерактивный вход в систему, добавьте следующее перед любым сообщением, которое будет напечатано в вашем файле .bash_profile .

# ********** If not running interactively, don't do anything more! ***********

[ -z "$PS1" ] && return

Во время неинтерактивного входа в систему scp он прекратит дальнейшее выполнение .bash_profile и позволит scp работать, но при входе через ssh будут отображаться ваши сообщения для входа.

Примечание. Это также может быть использовано в вашем файле .bashrc если вы исходите из него .bash_profile (для $ PATH), поэтому только часть его создается при неинтерактивных входах в систему.

0

Я звонил exec /bin/bash в .cshrc .

Удаление этого решило проблему для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .