Sao chép các tập tin được bảo vệ giữa các máy chủ trong một dòng?


13

Tôi muốn sao chép squid.conftừ máy chủ này sang máy chủ khác.

  • Các máy chủ không nói chuyện với nhau. Tôi muốn đi qua máy trạm của tôi.
  • Cả hai máy chủ đều có tệp, vì vậy nó sẽ được ghi đè lên mục tiêu.
  • Các tập tin có sự 600cho phép và được sở hữu bởi root.
  • đăng nhập root thông qua ssh bị vô hiệu hóa ( PermitRootLogin no).
  • Tôi muốn làm điều đó trong một dòng, nếu có thể, vì nó sẽ là một phần của hướng dẫn thiết lập.

Tôi biết phải làm

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

để sao chép các tập tin giữa các máy chủ và giữ quyền. Tuy nhiên, trong trường hợp này tôi sẽ nhận được "Quyền bị từ chối".

Tôi cũng biết tôi có thể làm điều này:

ssh -t source 'sudo cat /etc/squid/squid.conf'

Bằng cách này, -tsudo cho phép hỏi mật khẩu quản trị viên trước khi xuất nội dung của tệp.

Vấn đề là, tôi không biết cách kết hợp các kỹ thuật đó vào một cái gì đó sẽ yêu cầu mật khẩu sudo trên mỗi máy chủ và chuyển tệp đến đích. Điều này có thể không?

CẬP NHẬT : Đây là điều tốt nhất tôi có thể đưa ra:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

Gọi đây là một lót có vẻ như một căng. Tôi nghĩ rằng tôi sẽ chia nó thành các bước riêng biệt trong hướng dẫn thiết lập.


Câu trả lời:


11

Xâu chuỗi ssh với ssh dễ dàng hơn so với xâu chuỗi ssh với sudo. Vì vậy, thay đổi cấu hình máy chủ ssh là ok, tôi khuyên bạn nên mở ssh cho root của mỗi máy chủ, nhưng chỉ từ localhost. Bạn có thể làm điều này với một Matchmệnh đề trong sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Sau đó, bạn có thể thiết lập chuỗi xác thực dựa trên khóa từ người dùng từ xa đến người dùng cục bộ và từ người dùng cục bộ đến root. Bạn vẫn có một dấu vết xác thực để nhật ký của bạn cho bạn biết ai đã đăng nhập bằng root và các bước xác thực giống như khi có liên quan đến sudo.

Để kết nối với máy chủ với quyền root, hãy xác định bí danh ~/.ssh/confignhư sau:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

Nếu bạn khăng khăng sử dụng sudo, tôi tin rằng bạn sẽ cần các lệnh riêng biệt, vì sudokhăng khăng đọc từ thiết bị đầu cuối (ngay cả khi nó có vé cho tài khoản của bạn) và không có phương pháp sao chép tệp thông thường nào (scp, sftp, rsync) hỗ trợ tương tác với một thiết bị đầu cuối từ xa.

Bám sát với ssh và sudo, các lệnh được đề xuất của bạn có thể được đơn giản hóa. Ở mỗi bên, nếu bạn đã thiết lập sudo để không hỏi lại mật khẩu, bạn có thể chạy nó một lần để vượt qua yêu cầu mật khẩu và lần khác để sao chép tệp. (Bạn không thể dễ dàng sao chép tệp trực tiếp vì lời nhắc mật khẩu cản trở.)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ trừ khi bạn có NOPASSWD, nhưng sau đó bạn sẽ không được yêu cầu này.


Giải pháp đầu tiên hoạt động tốt với tôi nhưng dòng thứ hai nên có Match host localhost.
cduck

4

Bạn có thể thiết lập sudođể không hỏi mật khẩu theo cách tiếp theo:

Về nguồn:

user    ALL=NOPASSWD:/bin/cat

Về mục tiêu:

user    ALL=NOPASSWD:/usr/bin/tee

Và làm trên máy của bạn:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

Nhưng tôi khuyên bạn nên sử dụng một cái gì đó như con rối . Nó tốt hơn và dễ dàng hơn giải quyết vấn đề của bạn với phân phối tệp cấu hình.

Tái bút Nhân tiện, nếu bạn sẽ thiết lập sudođể hỏi mật khẩu từ người dùng, chuỗi có [sudo] password for usersẽ xuất hiện trong tệp mục tiêu.


+1 để đề xuất con rối, nhưng giải pháp của bạn có vẻ không an toàn. Tôi cũng có thể cho phép đăng nhập với quyền root.
itadok

2

Thay vì sử dụng ssh, bạn có thể sử dụng scp để chuyển tệp giữa các máy chủ.

Đăng nhập vào máy chủ đích:

Thay đổi thư mục đích nơi bạn muốn sao chép tệp.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - đệ quy p - Giữ nguyên thời gian sửa đổi, thời gian truy cập và chế độ từ tệp gốc


Điều này giả định rằng tôi có thể đăng nhập bằng root, mà tôi không thể. Cập nhật câu hỏi.
itadok

2

Không thay đổi cấu hình ssh, bạn có thể tạo hai đường dẫn ssh host-> server1 và server2-> host thông qua kết nối ssh đến server2. Kết nối hai đường hầm này trên máy chủ (cùng một cổng). Và chạy sudo trên server2 để lấy dữ liệu từ các đường hầm được kết nối trên server1 và lưu chúng trên server2.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

Ý tưởng là: 1- để tạo một đường hầm cục bộ từ máy của bạn đến máy nguồn trên cổng 60000

ssh -L60000:${source}:22

1b- Tạo một đường hầm từ xa để quay trở lại máy của bạn

-R60000:localhost:60000

2- kết nối với máy đích

-t ${target}

3- chạy tất cả dưới dạng root trên máy đích để viết

'sudo bash -c "..."'

4- kết nối với máy nguồn thông qua đường hầm. whoami và trên localhost có nghĩa là localhost trên máy $ {target}.

ssh -p 60000 '$(whoami)'@localhost

5- đóng gói (các) tệp từ xa và gửi tệp được nén vào thiết bị xuất chuẩn

cd /path/to/dir; tar -czf - file

6- nhận gói thông qua thiết bị xuất chuẩn và giải nén các tệp tương ứng trên thư mục / path / to / target

|tar -C/path/to/target -xzf -

Lưu ý: Bạn có thể nhận được tối đa 3 xác nhận sshkey và 3 yêu cầu mật khẩu. Nhưng các tập tin sẽ được sao chép qua.

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.