scp đến máy chủ từ xa với sudo


65

Tôi có một tệp trên máy chủ A (nằm sau NAT nên không thể truy cập trực tiếp). Tập tin cần được sao chép vào máy chủ B trong một thư mục bị hạn chế root. Tôi có một tài khoản trên máy chủ B với các đặc quyền sudo. Cú pháp của lệnh scp là gì?



Tôi đã đóng câu hỏi cũ hơn như một bản sao của câu hỏi này, vì người hỏi câu hỏi không bao giờ lấy lại quyền sở hữu câu hỏi đó.
quack quixote

Tôi đã trả lời trên một bài đăng khác làm thế nào bạn có thể tùy chỉnh scp làm sudo cho bạn trực tiếp. Điều này tương tự với những gì WinSCP làm.
YoYo

Câu trả lời:


58

Trước tiên, bạn cần sao chép tệp vào nơi bạn có quyền truy cập ghi mà không cần sudo,

scp yourfile serverb:

Sau đó di chuyển tệp bằng sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Nếu bạn không có một nơi có thể ghi, hãy tạo một thư mục tạm thời với quyền viết cho người dùng của bạn.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp là một nơi tốt để viết các tệp tạm thời (thường) tất cả người dùng có quyền truy cập.
Doug Harris

3
@Doug: Lưu ý rằng / tmp có thể nằm trong RAM hoặc trong / điểm gắn kết và không nhất thiết phải đủ lớn để lưu trữ các tệp lớn.
Ravachol

2
Bất cứ điều gì bạn đang cố gắng để thực hiện, chmod 777thường là cách sai để làm điều đó. Xem xét những gì có thể xảy ra nếu ai đó đã đăng nhập và biết bạn sắp chạy mã này.
tripleee

1
ssh sudokhông làm việc cho tôi - phàn nàn "không có tty hiện tại và không có chương trình hỏi qua được chỉ định"?
Ross Presser

1
@RossPresser xin lỗi vì trả lời trễ, nhưng bạn cần phải thiết lập sudo mật khẩu serverbhoặc bạn cần ssh serverbtách riêng, sau đó chạy sudo ...sau khi đăng nhập.
Johan

49

Với SCP, bạn phải thực hiện theo hai bước, tuy nhiên, bạn có thể thực hiện trong một bước với rsync như sau:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Lưu ý: Điều này không yêu cầu NOPASSWDcấu hình sudo. Nếu bạn phải nhập mật khẩu cho sudo, thì cách hai bước là cần thiết.

Để sao chép thư mục, bạn cần thêm -rtham số. Và -vcho đầu ra dài dòng.


Để sử dụng phương pháp trên với thông tin đăng nhập, bạn cần thêm chúng vào ~/.ssh/configtệp của mình , vd

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
Đây là cách đơn giản nhất để làm điều đó.
Matt White

Đã sudo: sorry, you must have a tty to run sudosửa lỗi -e "ssh -tt".
mj41

@ mj41 Với -e "ssh -tt", tôi nhận được protocol version mismatch -- is your shell clean?. Bất kỳ gợi ý về cách khắc phục điều đó?
rìu.

19

Bạn có thể sử dụng ssh và tar để giải quyết vấn đề này:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Điều này trước tiên cập nhật dấu thời gian sudo của bạn (yêu cầu mật khẩu nếu cần, yêu cầu tty ( ssh -t)), sau đó sử dụng sudo để tạo tarball từ xa và giải nén cục bộ.

"tar" trên RedHat 5 yêu cầu các tùy chọn "--preserve" xuất hiện sau lệnh "xpsf -".


Chỉ cần một lưu ý: nếu bạn nhận được tar: Invalid replacement string, loại bỏ -strong dường như để sửa nó (không chắc chắn những gì bạn cần scho dù sao). Cảm ơn nhiều; điều này thật tuyệt.
Đệ quy

Điều này sẽ yêu cầu tty_ticketsphải được vô hiệu hóa, đúng không?
Jacob Budin

@JacobBudin có.
xanh

4

Bạn có thể sử dụng sftp với lệnh sudo, ví dụ:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

Điều này và các phương thức rsync có lẽ là cách trực tiếp nhất để thực hiện trong một bước. Thật không may là nhiệm vụ scp trong kiến ​​không hỗ trợ nó. Bạn có thể đặt nó để sử dụng sftp, nhưng bạn không thể sửa đổi chương trình con từ xa. Lưu ý rằng chương trình con sẽ khác nhau tùy thuộc vào loại máy chủ (solaris có thể khác nhau).
YoYo

0

Nếu bạn cần nhập mật khẩu cho sudo mọi lúc, bạn có thể lưu nó vào một tệp:

echo "Enter password: "; read -s password; echo $password > password_file

và sau đó gửi nó cùng với tệp nguồn.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Bạn có thể sử dụng teethay vì spongenếu bạn không có nhiều hơn.


0

Trước tiên, bạn cần sao chép tệp vào nơi bạn có quyền truy cập ghi mà không cần sudo, Bạn có thể thực hiện hai bước sau.

Bước 1: scp filename newserver

Bước 2: ssh newserver sudo mv filename /path/to/the/destination

để biết thêm thông tin đọc hướng dẫn scp


-1
current server $ sudo scp username@server:source/path/filename /tmp/

Nó sẽ sao chép tập tin cụ thể từ nguồn vào / tmp / trong máy chủ hiện tại


Nó sẽ thực thi sudo cục bộ, không cho bạn đặc quyền nâng cao từ xa.
YoYo

Điều này sẽ không hoạt động, như @Yoyo nói.
Mani

scp có lẽ sẽ không kết nối, vì nó sẽ đọc khóa của root
Pierre-Olivier Vares
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.