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

57

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

$ scp file server:
                   _____  _____  _____
$

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

$ ssh server

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

scdmb
источник
Предоставьте дополнительную информацию, такую ​​как операционная система, файл конфигурации 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 ./

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

faitjx
источник
Это действительно полезно
клен
Можно ли обнаружить 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.

spoulson
источник
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.

InChargeOfIT
источник
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), так что только часть его создается при неинтерактивных входах в систему.

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

anarchist912
источник
0

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

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

провалы
источник