Lệnh SCP với tệp và thư mục được chọn để tải xuống hỏi mật khẩu cho mỗi tệp hoặc thư mục mới


9

Trên hệ thống Fedora 20 của tôi, tôi sử dụng scp rất nhiều và đây là lần thứ hai tôi gặp phải điều này, khi tôi chạy lệnh này:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

nó hỏi tôi mật khẩu cho mỗi tập tin / thư mục mà nó chuyển.

user@host's password: "password here"

Câu hỏi:

Có chuyện gì đang xảy ra ở đây?

Đây có phải là bình thường, tôi sẽ nghĩ rằng đây là hành vi rất đặc biệt?

Câu trả lời:


13

Shell cục bộ của bạn (có thể là bash) đang mở rộng

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

vào:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

Thay vào đó, bạn có thể làm:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

hoặc, nếu bạn biết vỏ đăng nhập của người dùng ở đầu xa là bash, bạn cũng có thể sử dụng mở rộng dấu ngoặc:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

để có shell từ xa tách chuỗi thành đối số thay vì shell cục bộ.


5

Vâng, đó là bình thường. Điều gì xảy ra là shell của bạn mở rộng các dấu ngoặc trước khi chạy lệnh, vì vậy những gì bạn thực sự đang chạy là

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

Về cơ bản, scpthấy nhiều yêu cầu kết nối để mở ra một kết nối mới cho mỗi yêu cầu kết nối. Một chiềuCách đơn giản nhất(sử dụng dấu ngoặc kép theo đề xuất của @geirha đơn giản hơn cho thao tác một lần) để giải quyết vấn đề này là thiết lập mật khẩu ssh/ scp:

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

Sau khi chạy hai lệnh đó một lần (và trả lời các lời nhắc khi cần), bạn sẽ có thể ssh/ scpkhông sử dụng mật khẩu cho tất cả các kết nối ssh trong tương lai. Đây là i) thực sự an toàn hơn và ii) nhiều thuận tiện hơn.


+1, cách hay (tất nhiên ssh-keygen & ssh-copy-id chỉ được thực hiện một lần). Tôi muốn nói rằng nó an toàn hơn ... chỉ khi bạn đảm bảo phần riêng tư "không thể truy cập được" bởi bất kỳ ai ngoại trừ người dùng đó ... Điều này không phải lúc nào cũng dễ dàng.
Olivier Dulac

@OlivierDulac có nghĩa là gì? Các id.rsasẽ có 600quyền theo mặc định và sshthậm chí sẽ không hoạt động nếu nó không. Điều này có nghĩa là nó an toàn với bất kỳ ai nhưng rootkhông có gì thực sự an toàn root, chắc chắn không phải mật khẩu.
terdon

Tôi chỉ muốn thêm bình luận này, để mọi người thiết lập quyền truy cập không cần mật khẩu có tính đến (và Grok) thực tế là khóa riêng phải ở trong một môi trường an toàn và không thể đọc / không chia sẻ / v.v. (nghĩa là, đó là một cách nhẹ nhàng để chỉ ra điều này, vì những người hỏi có thể không biết tất cả những hàm ý rằng việc chia sẻ / để khóa riêng có thể được truy cập)
Olivier Dulac

@OlivierDulac ah, đủ công bằng. Tôi không nghĩ nó đáng được đề cập vì 1) nó tự động xảy ra khi sử dụng ssh-keygenvà 2) ssh / scp sẽ khiếu nại và yêu cầu mật khẩu nếu bất kỳ ai khác có thể đọc được tệp. Ít nhất là trên Linux nào.
terdon

4

scp không thông minh lắm: khi được cung cấp nhiều đối số dòng lệnh là các tệp từ cùng một máy chủ từ xa, nó sẽ mở ra một kết nối mới cho mỗi đối số.

Bạn có thể sử dụng rsyncthay vì scp, nó thông minh hơn theo cách này (và theo những cách khác).

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Một cách tiếp cận khác là truyền một đối số duy nhất để scpmô tả nhiều tệp .

Một cách tiếp cận khác là thiết lập hệ thống của bạn để bạn không phải xác thực mọi lúc. Tốt hơn là, thiết lập xác thực khóa , trong hầu hết các trường hợp thuận tiện hơn và an toàn hơn. Ngoài ra, hoặc ngoài ra, hãy thiết lập chia sẻ kết nối để bạn chỉ cần xác thực một lần mỗi phiên. Trong mọi trường hợp, hãy thiết lập bí danh để bạn không phải chỉ định tên người dùng và cổng mỗi lần. Trong của bạn ~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

Chạy ssh -Nf nickđể mở một kết nối, và sau đó tất cả các kết nối tiếp theo nicksẽ cõng trên kết nối hiện có. Bây giờ bạn có thể chạy

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
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.