scp не працює, але ssh робить


56

Якщо я хочу надіслати щось через scp на сервер:

$ scp file server:
                   _____  _____  _____
$

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

$ ssh server

Як змусити роботу scp?


Надайте додаткову інформацію, таку як операційна система, конфігураційний файл ssh тощо.
qroberts

А що це за три рядки, які друкуються?
jjlin

У звичайному випадку, коли ви запускаєте scp file server:(припустимо, що "сервер" є дійсним ім'ям хоста), файл копіюється в каталог вашого облікового запису.
dan_linder

3
Чи можете ви надати вихід під час запуску "scp -v файлового сервера:".
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. Якщо десь show run | inc USERNAMEтам ви не бачите "привілей 15", вони не зможуть зробити scp.
Тайлер Абаер

Я в основному видалив "zsh" зі свого .bashrc на віддаленому сервері і scp почав працювати!
Geek

Він також порушується, якщо змінити змінну SHELL (наприклад export SHELL=/bin/zsh) в ~/.bashrc. Це іноді використовується у відсутність chsh.
Suuuehgi

57

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


10
EUREKA! Це була моя проблема, тому що я мав цілий стан | корова на кожному вході в мій віддалений .bashrc. Зараз ідеально працює.
Томас Браун

3
Ви, пане, рятівник. :)
Гаурав Манчанда

4
Якщо ви все ще хочете свого fortune | cowsay, просто покладіть його в .bash_profile. Це стосується лише інтерактивних входів, і їх не слід отримувати під час сеансу SCP.
подружжя

Моя проблема полягала в тому, що я знайшов ще один файл у своєму .bashrc, який би не існував на іншій машині. Ви можете використовувати логіку у цій відповіді, щоб пропустити, ~/.bashrcколи не інтерактивна (що стосується scp).
wisbucky

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 /

Надішліть файл веб-кореневі:

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

У цьому прикладі користувачеві john_doe знадобляться права доступу на віддалений каталог / var / www.


2
ви не відповідаєте на запитання. командний рядок, заданий ОП, виглядає досить нормально, цікавою частиною є ------... жоден із ваших прикладів не стосується цього.
акіра

@akira, може, може й ні. Надання дійсних шляхів призведе до відмови команди 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:

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