scp ไม่ทำงาน แต่ ssh ทำ


56

ถ้าฉันต้องการส่งบางอย่างผ่าน scp ไปยังเซิร์ฟเวอร์:

$ scp file server:
                   _____  _____  _____
$

จากนั้นสามบรรทัดจะถูกพิมพ์และไฟล์จะไม่คัดลอก อย่างไรก็ตามฉันสามารถเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน ssh ได้โดยไม่มีปัญหา:

$ ssh server

วิธีทำให้ scp ทำงาน


ให้ข้อมูลเพิ่มเติมเช่นระบบปฏิบัติการไฟล์ ssh config ฯลฯ
qroberts

แล้วสามบรรทัดนี้ที่พิมพ์ออกมาคืออะไร?
jjlin

ในกรณีปกติเมื่อคุณเรียกใช้scp file server:(สมมติว่า "เซิร์ฟเวอร์" เป็นชื่อโฮสต์ที่ถูกต้อง) ไฟล์จะถูกคัดลอกไปยังไดเรกทอรีบัญชีของคุณ
dan_linder

3
คุณสามารถให้ผลลัพธ์เมื่อคุณเรียกใช้ "เซิร์ฟเวอร์ไฟล์ scp -v:"
dan_linder

คุณอาจลองscpไปยังตำแหน่งอื่นบนเซิร์ฟเวอร์หลังจากนั้นcpmvssh
Jesse W. Collins

คำตอบ:


68

สาเหตุหนึ่งที่เป็นไปได้ของพฤติกรรมประเภทนี้คือมีข้อความใด ๆ ที่พิมพ์ออกมาในระหว่างกระบวนการเข้าสู่ระบบบนเซิร์ฟเวอร์ Scp ขึ้นอยู่กับ ssh เพื่อให้อุโมงค์ที่เข้ารหัสโปร่งใสทั้งหมดระหว่างไคลเอนต์และเซิร์ฟเวอร์

ตรวจสอบสคริปต์การเข้าสู่ระบบทั้งหมดบนเซิร์ฟเวอร์และลองใช้ผู้ใช้อื่น อีกวิธีหนึ่งในการระบุแหล่งที่มาของข้อผิดพลาดคือการใช้ -v ในคำสั่งเพื่อติดตามความคืบหน้าของการทำธุรกรรมและดูว่ามันล้มเหลวที่ไหน คุณสามารถใช้สูงสุด -vvv เพื่อเพิ่ม verbosity หากจำเป็น การตรวจสอบรูปแบบต่างๆของ 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 หรือไม่
Alexandros

ผู้ใช้จำเป็นต้องมีสิทธิ์ระดับ 15 หากผู้ใช้ไม่ใช่ระดับสิทธิ์ 15 ASA จะปิดการเชื่อมต่อหลังจากการรับรองความถูกต้องโดยไม่มีข้อความแสดงข้อผิดพลาดระบุถึงปัญหาสิทธิ์ นอกจากนี้เพียงเพราะผู้ใช้ของคุณสามารถพิมพ์enableและป้อนรหัสผ่านไม่ได้หมายความว่าพวกเขาเป็นส่วนตัว 15 หากคุณไม่เห็น "สิทธิ์ 15" ที่ไหนสักแห่งในshow run | inc USERNAMEนั้นพวกเขาจะไม่สามารถสแกน
Tyler Abair

ฉันลบ "zsh" ออกจาก. bashrc ของฉันบนเซิร์ฟเวอร์ระยะไกลและ scp เริ่มทำงาน!
Geek

นอกจากนี้ยังแบ่งถ้าคุณเปลี่ยน SHELL ตัวแปร (เช่นexport SHELL=/bin/zsh) ~/.bashrcใน chshนี้บางครั้งถูกนำมาใช้ในกรณีที่ไม่มี
Suuuehgi

57

ตรวจสอบไฟล์. bashrc ของผู้ใช้เป้าหมายหรือไฟล์ที่เทียบเท่า ~ / .bashrc มีที่มาสำหรับการเข้าสู่ระบบที่ไม่ใช่แบบโต้ตอบ ถ้ามีเสียงก้องหรือคำสั่งที่ให้อะไรมันจะทำลายโปรโตคอล SCP


10
EUREKA! นี่เป็นปัญหาของฉันเพราะฉันมีโชคลาภ cowsay ในการเข้าสู่ระบบแต่ละครั้งใน. bashrc ระยะไกลของฉัน ตอนนี้ทำงานได้อย่างสมบูรณ์
โทมัสบราวน์

3
คุณครับเป็นผู้ช่วยชีวิต :)
Gaurav Manchanda

4
หากคุณยังต้องการfortune | cowsayให้ใส่ไว้ใน. bash_profile สำหรับการเข้าสู่ระบบแบบโต้ตอบเท่านั้นและไม่ควรมีที่มาในระหว่างการใช้งาน SCP
spoulson

ปัญหาของฉันคือฉันกำลังจัดหาไฟล์อื่นในของฉัน.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 /

ส่งไฟล์ไปที่ webroot:

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

ในตัวอย่างนี้ผู้ใช้ john_doe จะต้องมีสิทธิ์ในการเขียนบนไดเรกทอรี remote / var / www


2
คุณไม่ได้ตอบคำถาม commandline ที่ให้โดย OP นั้นค่อนข้างโอเคส่วนที่น่าสนใจคือ------... ไม่มีตัวอย่างใดที่เกี่ยวข้องกับมัน
akira

@ 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

ซึ่งฉันเชื่อว่าเป็นรุ่นที่ยาวกว่าของรหัสทางเลือกแรก ฉันพบโฮสต์บางแห่งแล้วรหัสแรกไม่ทำงานอย่างถูกต้อง แต่อันที่สองทำงานได้

ในระหว่างการเข้าสู่ระบบแบบ non-interactive scp มันจะยกเลิกการทำงานของ. bash_profile เพิ่มเติมและอนุญาตให้ scp ทำงาน แต่จะแสดงข้อความเข้าสู่ระบบของคุณเมื่อคุณเข้าสู่ระบบผ่าน ssh

หมายเหตุ: ไฟล์นี้สามารถใช้ใน.bashrcไฟล์ของคุณได้หากคุณส่งมาจาก.bash_profile(สำหรับ $ PATH) ดังนั้นจึงมีเพียงบางส่วนเท่านั้นที่มีแหล่งที่มาในระหว่างการเข้าสู่ระบบแบบไม่โต้ตอบ


ขอบคุณทำงานเหมือนจับใจ ........
somethingSomething

0

นี่ไม่ได้ตอบคำถามโดยตรง แต่อาจเป็นประโยชน์สำหรับคนอย่างฉันกำลังมองหาวิธีแก้ปัญหาด้วยการแช่แข็ง SCP เมื่อถ่ายโอนไฟล์ระหว่างโฮสต์ระยะไกล 2 แห่ง

หาก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 ของเครื่องที่ใช้งานสคริปต์ แน่นอนว่านี่เป็นเพียงวิธีการแก้ปัญหาหากเครื่องระยะไกลอยู่ภายในเครือข่ายที่เชื่อถือได้ของคุณ


0

ฉันถูกเรียกในexec /bin/bash.cshrc

การลบสิ่งนี้แก้ปัญหาให้ฉันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.