SCP виходить з ладу без помилок


45

Я певний час відчував дуже дивну поведінку SCP: коли я намагаюся скопіювати файл, вихід SCP містить купу підкреслень, і файл не копіюється.

$ scp test.txt 192.168.0.2:~
job@192.168.0.2's password: 
 ________________________________________

Коли я створюю SSH-з'єднання за допомогою Midnight Commander і копіюю файли, це працює.

Деякі відомості про мою машину:

$ ssh -V
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010

$ uname -a
Linux squatpc 2.6.38-10-generic #46-Ubuntu SMP Tue Jun 28 15:05:41 UTC 2011 i686 i686 i386 GNU/Linux

І я запускаю Kubuntu 11.04.

Редагувати: ще трохи інформації, як вимагають коментарі:

$ scp -v test.txt 192.168.0.2:~
Executing: program /usr/bin/ssh host 192.168.0.2, user (unspecified), command scp -v -t -- ~
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 192.168.0.2 [192.168.0.2] port 22.
debug1: Connection established.
debug1: identity file /home/job/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: identity file /home/job/.ssh/id_rsa-cert type -1
debug1: identity file /home/job/.ssh/id_dsa type -1
debug1: identity file /home/job/.ssh/id_dsa-cert type -1
debug1: identity file /home/job/.ssh/id_ecdsa type -1
debug1: identity file /home/job/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.8p1 Debian-1ubuntu3
debug1: match: OpenSSH_5.8p1 Debian-1ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1 Debian-1ubuntu3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA 28:f3:2b:31:36:43:9b:07:d8:33:ca:43:4f:ca:6c:4c
debug1: Host '192.168.0.2' is known and matches the ECDSA host key.
debug1: Found key in /home/job/.ssh/known_hosts:20
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/job/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/job/.ssh/id_dsa
debug1: Trying private key: /home/job/.ssh/id_ecdsa
debug1: Next authentication method: password
job@192.168.0.2's password: 
debug1: Authentication succeeded (password).
Authenticated to 192.168.0.2 ([192.168.0.2]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: scp -v -t -- ~
 ________________________________________
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
Transferred: sent 2120, received 1872 bytes, in 0.3 seconds
Bytes per second: sent 7783.1, received 6872.6
debug1: Exit status 0

і

$ type scp
scp is hashed (/usr/bin/scp)

1
Спробуйте з -v отримати інформацію про налагодження під час копіювання.
EightBitTony

Крім того, про всяк випадок ... Який результат type scp?
rozcietrzewiacz

@EightBitTony: переглянути мої зміни.
Робота

@rozcietrzewiacz: дивіться також мої зміни :-)
робота

2
Якщо ви це робите ssh 192.168.0.2 echo hello, чи отримуєте ви інші результати, крім hello?
Жил 'SO- перестань бути злим'

Відповіді:


77

Гаразд LOL, я просто зрозумів, в чому проблема.

Оскільки я так люблю корів, то fortune | cowsayпід .bashrcчас запуску я помістив у верхній частині свого файлу, який дає такий результат, як наступний bash:

 _______________________________________
< You will lose an important disk file. >
 ---------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Це все добре (а іноді і смішно) при bashінтерактивному бігу . Однак bash читає, ~/.bashrcколи це інтерактивна, а не оболонка входу, або коли це оболонка входу, і її батьківський процес є rshdабоsshd . Під час запуску scpсервер запускає оболонку, яка запускає віддалений scpекземпляр. Вихід з .bashrcплутанини, scpоскільки він надсилається так само, scpяк надсилаються дані протоколу. Це, мабуть, відома помилка, дивіться тут детальніше.

Також зауважте, що підкреслення, про які я згадував у запитанні, знаходяться у верхньому рядку текстової кулі.

Тож рішення було простим: я поставив наступне у верхній частині .bashrcна віддаленій (цільовій) машині:

# If not running interactively, don't do anything
[[ $- == *i* ]] || return

Цей рядок присутній за замовчуванням, .bashrcале його було відкладено через мої численні (мабуть, необережні) зміни.


echo "don't have a cow" | cowsay
Стефан Гіменез

Ого, після того, як місяці scp просто розбилися, ти нарешті висвітлив мені відповідь. Я б ніколи про це не думав. Я просто зробив mv ~/.bashrc ~/.bashrc.bakтест і переконався, що це проблема, і це спрацювало після того, як я це зробив.
Jondlm

@ScottStensland Це потрібно пройти у верхній частині пульта .bashrc. Місцеве значення не має. Зауважте, що в моєму коментарі була помилка друку (відповідь правильна): так *i*, ні *-*.
Жил "ТАК - перестань бути злим"

НІ-НІ-НІ. rtfm. bashrc працює для неінтерактивних оболонок. Якщо ви хочете повідомляти щасливих корів під час входу, змініть свій bash_profile. Якщо ви хочете коров'яче мудрість кожного разу , коли ви відкриваєте X-Window , то спробуйте працювати, якщо це один з БАГАТЬОХ сценаріїв , в яких ви не повинні писати термінал - unix.stackexchange.com/questions/9605 / ...
symcbean

5

AFAIK, правильний спосіб увімкнути безперешкодний випадок scpменший, ніж умовний для stdout у вашому ~/.bashrcсценарії, і більше про просто обмеження виводу екрана на ~/.bash_profileсценарій. Принаймні, так це працює для мого дистрибутива (CentOS.)

Редагування для наочності:

  1. Вкладайте у файл ~ / .bashrc лише рядки, як того вимагають віддалені підключення "всі" (тобто встановлення певних ENV-вар. Нормально, але повторюваний текст, прочитаний людиною, не є.)
  2. YMMV

розум викладає? тобто як обмежити вихід з екрана на .bash-профіль?
javadba

1
Під screenвиходом я маю на увазі echo "Greetings, Master"або що-небудь інше, що відображає вихід у вікно терміналу. Не вкладайте це у свій ~ / .bashrc - зберігайте це у своєму сценарії ~ / .bash_profile.
Марк Хадсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.