scp không hoạt động nhưng ssh không


56

Nếu tôi muốn gửi một cái gì đó qua scp đến máy chủ:

$ scp file server:
                   _____  _____  _____
$

, sau đó ba dòng được in và tập tin không được sao chép. Tuy nhiên tôi có thể kết nối với máy chủ qua ssh mà không gặp vấn đề gì:

$ ssh server

Làm thế nào để làm cho scp làm việc?


Cung cấp thêm thông tin như hệ điều hành, tệp cấu hình ssh, v.v.
qroberts

Và ba dòng này được in là gì?
jjlin

Trong trường hợp bình thường, khi bạn chạy scp file server:(giả sử "máy chủ" là tên máy chủ hợp lệ), tệp sẽ được sao chép vào thư mục tài khoản của bạn.
dan_linder

3
Bạn có thể cung cấp đầu ra khi bạn chạy "máy chủ tệp scp -v:".
dan_linder

Bạn có thể thử scpđến một vị trí khác trên máy chủ, sau đó là một cphoặc mvsaussh
Jesse W. Collins

Câu trả lời:


68

Một nguyên nhân có thể của loại hành vi này là có bất kỳ thông báo nào được in ra trong quá trình đăng nhập trên máy chủ. Scp phụ thuộc vào ssh để cung cấp một đường hầm được mã hóa hoàn toàn trong suốt giữa máy khách và máy chủ.

Kiểm tra tất cả các tập lệnh đăng nhập trên máy chủ và cũng thử sử dụng một người dùng khác. Một phương pháp khác để xác định nguồn gốc của lỗi là sử dụng -v trong lệnh, để theo dõi tiến trình của giao dịch và xem lỗi ở đâu. Bạn có thể sử dụng tối đa -vvv để tăng mức độ chi tiết, nếu cần thiết. Kiểm tra các hình thức khác nhau của scp cũng có thể được hướng dẫn, như được liệt kê trong bài viết của InChargeOfIT.

scp, dưới mui xe, thiết lập một đường hầm bằng ssh và sau đó chuyển tệp qua đường hầm đó, bằng lệnh ssh ở phía xa để bắt tệp khi nó đi qua. Điều này được minh họa bằng cách sử dụng tar và ssh để sao chép cấu trúc thư mục duy trì thời gian sở hữu và tạo bằng các lệnh sau:

  tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

để gửi nó qua, và

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

để lấy lại


Nó thực sự hữu ích
maple

Có thể phát hiện scp trong .bashrc không? Vì vậy, bạn có thể kiểm tra và chỉ in đầu ra khi shell không phải là scp?
Alexandros

Người dùng cũng cần phải là đặc quyền cấp 15. Nếu người dùng không phải là đặc quyền cấp 15, ASA sẽ chỉ đóng kết nối sau khi xác thực không có thông báo lỗi cho biết vấn đề đặc quyền. Ngoài ra, chỉ vì người dùng của bạn có thể nhập enablevà nhập mật khẩu không có nghĩa là họ là riêng tư 15. Nếu bạn không thấy "đặc quyền 15" ở đâu show run | inc USERNAMEđó thì họ sẽ không thể truy cập được.
Tyler Abair

Về cơ bản tôi đã xóa "zsh" khỏi .bashrc trên máy chủ từ xa và scp bắt đầu hoạt động!
Geek

Nó cũng bị hỏng nếu bạn thay đổi biến SHELL (ví dụ export SHELL=/bin/zsh) trong ~/.bashrc. Điều này đôi khi được sử dụng mà không có chsh.
Suuuehgi

58

Kiểm tra .bashrc hoặc tệp tương đương của người dùng đích. ~ / .bashrc có nguồn gốc cho các thông tin đăng nhập không tương tác. Nếu có tiếng vang hoặc lệnh tạo ra bất cứ thứ gì, nó sẽ phá vỡ giao thức SCP.


10
EUREKA! Đây là vấn đề của tôi vì tôi đã có một gia tài | Coway trên mỗi lần đăng nhập trong .bashrc từ xa của tôi. Bây giờ làm việc hoàn hảo.
Thomas Browne

3
Thưa ngài, là một cứu cánh. :)
Gaurav Manchanda

4
Nếu bạn vẫn muốn fortune | cowsay, chỉ cần đặt nó vào .bash_profile. Đó là chỉ đăng nhập tương tác và không nên có nguồn gốc trong phiên SCP.
spoulson

Vấn đề của tôi là tôi đã tìm nguồn cung cấp một tệp khác trong .bashrcđó, tệp này không tồn tại trên máy kia. Bạn có thể sử dụng logic trong câu trả lời này để bỏ qua ~/.bashrckhi không tương tác (đó là trường hợp scp).
wvducky

15

Chỉnh sửa: Bạn có tích cực rằng bạn đang nhập vào một đường dẫn hợp lệ trong lệnh scp? Ví dụ:

scp test.txt username@remoteserver.com

sẽ thất bại (trên thực tế, nó sẽ chỉ in ra lệnh như bạn đang thấy). Trong trường hợp này, bạn sẽ cần cung cấp một đường dẫn hợp lệ đến máy chủ từ xa .. ví dụ:scp test.txt username@remoteserver.com:~/

Ví dụ sử dụng:

Gửi một tập tin:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

Nhận một tập tin:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

Ví dụ:

Gửi tệp từ Máy tính để bàn của tôi đến thư mục nhà của tôi trên máy chủ từ xa:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

Hãy nhớ rằng đó ~là một phím tắt cho thư mục chính của bạn ... ví dụ: / home /

Gửi tệp đến webroot:

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

Trong ví dụ này, người dùng john_doe sẽ cần các đặc quyền ghi trên thư mục remote / var / www.


2
bạn không trả lời câu hỏi dòng lệnh được đưa ra bởi OP có vẻ khá ổn, phần thú vị là ------... không có ví dụ nào của bạn liên quan đến điều đó.
akira

@akira có thể, có thể không. Không cung cấp đường dẫn hợp lệ sẽ khiến lệnh scp không thành công .. ví dụ: scp somefile user@host.com:Ngoài ra, việc không có quyền chính xác trên thư mục từ xa cũng sẽ gây ra sự cố. Đã chỉnh sửa câu trả lời của tôi để làm cho nó rõ ràng hơn một chút
InChargeOfIT

1
không có ví dụ nào của bạn bao gồm "tập tin không tồn tại", không có ví dụ nào của bạn bao gồm "quyền sai ở phía máy chủ" ...
akira

4

Trên một số máy chủ, họ cung .bash_profilecấp nguồn không chính xác cho các thông tin đăng nhập không tương tác như scp. Tin nhắn được in đến thiết bị đầu cuối có thể có thể gây ra scphoạt động không chính xác. Nếu bạn có tin nhắn trong .bash_profileđó có thể là nguyên nhân.

Để vẫn có thông điệp đăng nhập, biểu ngữ, v.v. của bạn hiển thị trên thông tin đăng nhập tương tác và vẫn có thể sử dụng scpthông qua thông tin đăng nhập không tương tác, hãy thêm vào sau đây trước bất kỳ thông báo nào sẽ in ra trong .bash_profiletệp của bạn .

# ********** If not running interactively, don't do anything more! ***********

[ -z "$PS1" ] && return

Mã thay thế là:

[[ $- == *i* ]] || return

Và một mã thay thế khác:

case $- in
    *i*) ;;
      *) return;;
esac

Mà tôi tin là phiên bản dài hơn của mã thay thế đầu tiên. Tôi đã tìm thấy trên một số máy chủ mã đầu tiên không hoạt động chính xác nhưng mã thứ hai thì không.

Trong quá trình đăng nhập scp không tương tác, nó sẽ hủy bỏ việc thực thi thêm .bash_profile và cho phép scp hoạt động, nhưng sẽ hiển thị thông điệp đăng nhập của bạn khi bạn đăng nhập qua ssh.

Lưu ý: Điều này cũng có thể được sử dụng trong .bashrctệp của bạn nếu bạn lấy nguồn từ .bash_profile(với $ PATH) để chỉ một phần của nó có nguồn gốc trong các lần đăng nhập không tương tác.


cảm ơn làm việc như một bùa mê ........
một cái gì đó

0

Điều này không trả lời trực tiếp câu hỏi, nhưng có thể hữu ích cho những người như tôi, đang tìm kiếm một giải pháp với scp đóng băng khi chuyển tệp giữa 2 máy chủ từ xa.

Nếu scpbị treo vì tin nhắn từ ssh, nó có thể giúp loại bỏ chúng:

scp -o "StrictHostKeyChecking no"

và / hoặc

scp -B

Từ người đàn ông scp:

-B Chọn chế độ hàng loạt (ngăn yêu cầu mật khẩu hoặc cụm mật khẩu).

-o ssh_option Có thể được sử dụng để chuyển các tùy chọn cho ssh theo định dạng được sử dụng trong đó không có cờ dòng lệnh scp riêng biệt. Để biết chi tiết đầy đủ về các tùy chọn được liệt kê bên dưới và các giá trị có thể có của chúng, hãy xem ssh_config (5).

Trong trường hợp của tôi có vẻ như giúp đỡ, nhưng không giải quyết được toàn bộ vấn đề. Chúng tôi không thể tìm ra lý do tại sao scp bị treo khi chuyển từ xa sang từ xa. Nó treo ở giữa tập tin. 9 lần nó hoạt động, nỗ lực số 10 thì không. Chúng tôi nghi ngờ rằng nó có thể bị treo khi kết nối VPN của chúng tôi tăng lưu lượng truy cập trong giây lát và sau đó scp không phục hồi. Nó thực sự chỉ bị treo mãi mãi và thậm chí không đưa ra thông báo lỗi.

Tuy nhiên, tôi đã từ bỏ và chuyển sang sftp. Điều này là nhanh hơn hợp lý, vì nó sử dụng một kết nối trực tiếp giữa các máy chủ từ xa. Bạn phải kích hoạt

Host example.com
    AgentForward yes

trong tệp ~ / .shh / config của máy đang chạy tập lệnh. Tất nhiên đây chỉ là một giải pháp nếu các máy từ xa đều nằm trong mạng tin cậy của bạn.


0

Tôi đã gọi exec /bin/bashvào .cshrc.

Loại bỏ điều này đã giải quyết vấn đề cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.