Làm cách nào tôi có thể đặt các biến môi trường cho quy trình rsync từ xa?


12

Khi tôi sử dụng rsync để sao chép tệp từ máy tính này sang máy tính khác, quy trình rsync được bắt đầu ở cả hai đầu. Tuy nhiên, ở đầu từ xa, các tệp khởi tạo shell dường như không được đọc, vì vậy tôi không thể thiết lập các biến môi trường cho quy trình rsync từ xa. Thật không may, có một máy chủ mà tôi cần rsync để rsync yêu cầu biến môi trường để hoạt động. Tôi không phải là quản trị viên trên máy chủ, vì vậy tôi không thể thay đổi cấu hình toàn cầu. Tôi có thể làm gì để đặt các biến môi trường cho quy trình rsync từ xa?


Làm thế nào để bạn bắt đầu quá trình rsync trên máy chủ? Bạn có thể kích hoạt một tập lệnh thông qua ssh?
kraftan

Khi bạn làm như vậy rsync localfilename remotehost:remotefilename, một quy trình rsync được bắt đầu trên máy chủ. Tôi không chắc chắn chính xác như thế nào, nhưng nó không đọc bất kỳ tệp khởi tạo shell nào.
Ryan C. Thompson

Câu trả lời:


20

~/.profilethường không được đọc khi bạn chạy ssh somecommand, trái ngược với phiên ssh tương tác (hoặc phương thức đăng nhập khác nơi bạn bắt đầu phiên tương tác).

Ssh hỗ trợ gửi các biến môi trường. Trong OpenSSH, sử dụng SendEnvchỉ thị trong ~/.ssh/config. Tuy nhiên, biến môi trường cụ thể phải được bật bằng một lệnh AcceptEnvtrong cấu hình máy chủ , vì vậy điều này có thể không phù hợp với bạn.

OpenSSH cũng cho phép thiết lập các biến môi trường ở phía máy chủ. Một lần nữa, điều này phải được kích hoạt trong cấu hình máy chủ, ở đây với PermitUserEnvironmentchỉ thị. Các biến có thể được đặt trong tệp ~/.ssh/environment. Giả sử bạn sử dụng xác thực khóa chung, bạn cũng có thể đặt biến per-key trong ~/.ssh/authorized_keys: add environment="FOO=bar"ở đầu dòng có liên quan.

Một điều mà tôi nghĩ luôn luôn hoạt động (đủ kỳ lạ) miễn là bạn đang sử dụng xác thực khóa chung là (ab) sử dụng command=tùy chọn trong authorized_keystệp. Một khóa với một commandtùy chọn chỉ tốt khi chạy lệnh được chỉ định; nhưng lệnh trong authorized_keystệp chạy với biến môi trường SSH_ORIGINAL_COMMANDđược đặt thành lệnh do người dùng chỉ định (trống cho các phiên tương tác). Vì vậy, bạn có thể sử dụng một cái gì đó như thế này ~/.ssh/authorized_keys(tất nhiên, nó sẽ không áp dụng nếu bạn không sử dụng khóa này để xác thực):

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

Lưu ý rằng tôi đặt ngắt dòng ở trên cho mức độ dễ đọc, nhưng điều này thực sự cần phải nằm trên một dòng.

Một khả năng khác là viết một tập lệnh bao bọc ~/bin/rsync-wrappertrên máy chủ, đại loại như

#!/bin/sh
. ~/.profile
exec rsync "$@"

Sau đó truyền --rsync-path='bin/rsync-wrapper'vào rsyncdòng lệnh. Đối số --rsync-pathđược mở rộng bằng shell, vì vậy nếu bạn thích, bạn có thể đặt dòng lệnh rsync độc lập bằng cách chuyển một cái gì đó như --rsync-path='. ~/.profile; rsync'.

Có một con đường khác phụ thuộc vào vỏ đăng nhập của bạn là bash hoặc zsh. Bash luôn đọc ~/.bashrckhi nó được gọi bởi rshd hoặc sshd, ngay cả khi nó không tương tác (nhưng không được gọi là as sh). Zsh luôn đọc ~/.zshenv.

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

Vâng, đó là tổng hợp khá nhiều. Tôi hy vọng có một cách tốt hơn là sử dụng tập lệnh bao bọc.
Ryan C. Thompson

Nhưng đợi một chút. Nếu các tệp shell init của tôi không được đọc, làm sao nó có thể tìm thấy nhị phân rsync trên máy chủ? Tôi đã cài đặt trong ~ / usr, một vị trí không chuẩn mà tôi phải thêm vào $PATHtập lệnh shell shell của mình.
Ryan C. Thompson

@Ryan: Tôi thực sự đã quên phương thức trực tiếp nhất (xem phần chỉnh sửa của tôi), nhưng nó cũng yêu cầu một lệnh được kích hoạt trong cấu hình máy chủ. Nếu bạn đã tìm được cách đưa PATHtài khoản của mình vào, bạn sẽ có thể đặt bất kỳ biến nào khác ở đó. (Nếu đó không làm việc, cố gắng thêm bao nhiêu dấu vết như bạn có thể, bắt đầu với set -xtrong bất kỳ kịch bản shell; thay thế rsyncnhị phân bằng một kịch bản wrapper rằng bãi môi trường vào một tập tin sau đó gọi nhị phân thực.)
Gilles 'SO - đừng trở nên xấu xa '

Thế còn ~/.ssh/rc?
Ryan C. Thompson

@Ryan: ~/.ssh/rcđược thực hiện bởi một quy trình shell riêng biệt. Tôi nghĩ rằng đặt cược tốt nhất của bạn là một kịch bản bao bọc hoặc --rsync-path='. ~/.profile; rsync'. Hoặc biên dịch lại rsyncvới một đường dẫn phù hợp theo câu hỏi khác của bạn.
Gilles 'SO- ngừng trở nên xấu xa'
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.