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?
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


77

โอเคฮ่า ๆ ฉันแค่คิดออกว่าปัญหาคืออะไร

เนื่องจากฉันชอบวัวมากฉันจึงfortune | cowsayอยู่ที่ด้านบนสุดของ.bashrcไฟล์ซึ่งสร้างผลลัพธ์ดังนี้เมื่อเริ่มต้นbash:

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

ทั้งหมดนี้เป็นเรื่องปกติ (และบางครั้งก็ตลก) เมื่อทำงานbashแบบโต้ตอบ อย่างไรก็ตามทุบตีอ่าน~/.bashrcเมื่อมันมีการโต้ตอบและไม่ได้เป็นเปลือกเข้าสู่ระบบหรือเมื่อมันเป็นเปลือกเข้าสู่ระบบและการปกครองที่เป็นrshdsshdหรือ เมื่อคุณเรียกใช้scpเซิร์ฟเวอร์จะเริ่มเชลล์ซึ่งเริ่มต้นscpอินสแตนซ์ระยะไกล เอาท์พุทจาก.bashrcความสับสนscpเพราะมันถูกส่งแบบเดียวกับscpที่ส่งข้อมูลโปรโตคอล เห็นได้ชัดว่านี่เป็นข้อผิดพลาดที่รู้จักดูที่นี่สำหรับรายละเอียดเพิ่มเติม

นอกจากนี้โปรดทราบว่าขีดเส้นใต้ที่ฉันพูดถึงในคำถามนั้นอยู่ในบรรทัดบนสุดของบอลลูนข้อความ

ดังนั้นทางออกนั้นง่าย: ฉันใส่สิ่งต่อไปนี้ไว้ที่ด้านบนของ.bashrcบนเครื่องปลายทาง

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

บรรทัดนี้มีอยู่ในค่าเริ่มต้น.bashrcแต่ถูกวางลงเนื่องจากการแก้ไขของฉัน (ไม่สนใจเลย) จำนวนมาก


echo "don't have a cow" | cowsay
Stéphane Gimenez

ว้าวหลังจากผ่านไปหลายเดือนของการถูกทำลายในที่สุดคุณก็ส่องสว่างคำตอบให้ฉัน ฉันจะไม่เคยคิดเรื่องนี้ ฉันเพิ่งmv ~/.bashrc ~/.bashrc.bakทำการทดสอบและตรวจสอบให้แน่ใจว่าเป็นปัญหาและทำงานได้หลังจากที่ฉันทำเช่นนั้น
Jondlm

@ScottStensland .bashrcนี้ต้องไปที่ด้านบนของระยะไกล ท้องถิ่นไม่เกี่ยวข้อง โปรดทราบว่ามีการพิมพ์ผิดในความคิดเห็นของฉัน (คำตอบคือถูกต้อง): มันไม่ได้*i* *-*
Gilles 'ดังนั้นหยุดความชั่วร้าย'

ไม่ไม่ไม่. RTFM bashrc ทำงานสำหรับเชลล์ที่ไม่มีการโต้ตอบ หากคุณต้องการข้อความวัวมีความสุขเมื่อคุณเข้าสู่ระบบเปลี่ยน bash_profile ของคุณ หากคุณต้องการสติปัญญาของวัวทุกครั้งที่คุณเปิด X-Window ให้ลองทำดูว่านี่เป็นหนึ่งในหลาย ๆสถานการณ์ที่คุณไม่ควรเขียนเทอร์มินัล - unix.stackexchange.com/questions/9605/ …
symcbean

5

AFAIK วิธีที่ถูกต้องในการเปิดใช้งาน un-hindered scpนั้นน้อยกว่าเงื่อนไขที่ stdout ใน~/.bashrcสคริปต์ของคุณมี~/.bash_profileอยู่ อย่างน้อยนั่นเป็นวิธีการทำงานสำหรับ distro ของฉัน (CentOS)

แก้ไขเพื่อความชัดเจน:

  1. ใส่เฉพาะบรรทัดในไฟล์ ~ / .bashrc ของคุณตามความต้องการของการเชื่อมต่อระยะไกล "all" (เช่นการตั้งค่า vars ENV บางอย่างนั้นใช้ได้ แต่การสะท้อนข้อความที่มนุษย์อ่านไม่ได้)
  2. YMMV

ใจที่ชัดเจน? คือวิธี จำกัด การแสดงผลหน้าจอไปยัง. bash-profile
javadba

1
ตามscreenผลลัพธ์ฉันหมายถึงecho "Greetings, Master"หรืออย่างอื่นที่แสดงผลลัพธ์ไปยังหน้าต่างเทอร์มินัล อย่าใส่ลงใน ~ / .bashrc - เก็บไว้ในสคริปต์ ~ / .bash_profile ของคุณ
Mark Hudson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.