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


57

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

$ scp file server:
                   _____  _____  _____
$

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

$ ssh server

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


Предоставьте дополнительную информацию, такую ​​как операционная система, файл конфигурации ssh и т. Д.
— qroberts

И что это за три строки, которые напечатаны?
— jjlin

В обычном случае, когда вы запускаете scp file server:(предполагая, что «server» является допустимым именем хоста), файл копируется в каталог вашей учетной записи.
— dan_linder

3
Можете ли вы предоставить вывод при запуске «scp -v file server:».
— dan_linder

Вы могли бы попытаться scpв другом месте на сервере, затем cpили mvпослеssh
— Джесси Коллинз

Ответы:


68

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

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


Это действительно полезно
— клен

Можно ли обнаружить scp в .bashrc? Так что вы можете проверить и распечатать вывод только тогда, когда оболочка не является scp?
— Александрос

Пользователь также должен иметь уровень привилегий 15. Если пользователь не имеет уровня привилегий 15, ASA просто закроет соединение после аутентификации без сообщения об ошибке, указывающего на проблему с привилегиями. Кроме того, enableтот факт , что ваш пользователь может вводить и вводить пароль, не означает, что он имеет привилегию 15. Если вы не видите «привилегию 15» где-то в этом месте, show run | inc USERNAMEон не сможет выполнить scp.
— Тайлер Абаир

Я в основном удалил "zsh" из моего .bashrc на удаленном сервере, и scp начал работать!
— Компьютерщик

Он также ломается, если вы изменяете переменную SHELL (например export SHELL=/bin/zsh) в ~/.bashrc. Это иногда используется в отсутствие chsh.
— Suuuehgi

58

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


10
EUREKA! Это была моя проблема, потому что у меня было состояние | cowsay при каждом входе в мой удаленный .bashrc. Сейчас работает отлично.
— Томас Браун

3
Вы, сэр, спасатель. :)
— Гаурав Манчанда

4
Если вы все еще хотите fortune | cowsay, просто поместите его в .bash_profile. Это только для интерактивных входов в систему и не должно быть получено во время сеанса SCP.
— Спулсон

Моя проблема заключалась в том, что я использовал другой файл .bashrc, который не существовал бы на другом компьютере. Вы можете использовать логику в этом ответе, чтобы пропустить, ~/.bashrcкогда неинтерактивен (что имеет место для scp).
— Висбуки

15

Изменить: Вы уверены, что вводите правильный путь в команде 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.


2
Вы не отвечаете на вопрос. командная строка, заданная OP, выглядит довольно хорошо, интересная часть ------... ни один из ваших примеров не связан с этим.
— Акира

@ Акира может быть, а может и нет. Отсутствие допустимых путей приведет к сбою команды scp. Например, scp somefile user@host.com:также отсутствие правильных разрешений для удаленного каталога также может вызвать проблемы. Отредактировал мой ответ, чтобы сделать его немного понятнее
— InChargeOfIT

1
ни один из ваших примеров не покрывает «файл не существует», ни один из ваших примеров не охватывает «неправильные разрешения на стороне сервера» ...
— akira

4

На некоторых хостах они неправильно .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_profile и позволит scp работать, но при входе через ssh будут отображаться ваши сообщения для входа.

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


спасибо работает как очарование ........
— что-то

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 компьютера, на котором запущен скрипт. Конечно, это только решение, если оба удаленных компьютера находятся в вашей доверенной сети.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.