2012-02-29 15:44:22 +0000 2012-02-29 15:44:22 +0000
60
60

scp не работает, но ssh работает

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

$ scp file server:
                   __________  _____
$

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

$ ssh server

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

Ответы (6)

72
72
72
2012-03-04 02:57:22 +0000

Одной из возможных причин такого поведения является распечатка ** любого** сообщения во время входа в систему на сервере. 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 ./

для возврата.

61
61
61
2014-06-03 18:20:48 +0000

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

15
15
15
2012-02-29 17:21:01 +0000

Правка: Вы уверены, что вводите правильный путь в команде 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 понадобятся права на запись в удаленный каталог /var/www.

5
5
5
2018-12-02 14:21:35 +0000

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

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

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

[-z "$PS1"] && return

Альтернативный код:

[[$- == *i*]] || return

И еще один альтернативный код:

case $- in
    *i*) ;;
      *) return;;
esac

Который, на мой взгляд, является более длинной версией первого альтернативного кода. На некоторых хостах я обнаружил, что первый код работает некорректно, а второй - некорректно.

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

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

0
0
0
2018-10-14 14:34:43 +0000

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

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

0
0
0
2018-10-02 14:01:50 +0000

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

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

scp -o "StrictHostKeyChecking no"

и / или

scp -B

** Из scp man:**

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

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

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

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

Host example.com
    AgentForward yes

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

Похожие вопросы

19
12
16
13
3