Làm thế nào tôi có thể vượt qua một biến môi trường thông qua một lệnh ssh? [bản sao]


42

Làm cách nào tôi có thể chuyển một giá trị vào lệnh ssh, sao cho môi trường được khởi động trên máy chủ bắt đầu với một biến môi trường nhất định được đặt theo lựa chọn của tôi?

EDIT: Mục tiêu là chuyển máy tính để bàn kde hiện tại (từ dcop kwin KWinInterface currentDesktop) sang shell mới được tạo để tôi có thể gửi lại một vị trí nfs cho phiên bản JEdit của tôi trên máy chủ gốc duy nhất cho mỗi máy tính để bàn KDE. (Sử dụng cơ chế như emacsserver / emacsclient )

Lý do nhiều trường hợp ssh có thể xuất hiện cùng một lúc là vì khi tôi thiết lập môi trường của mình, tôi đang mở một loạt các trường hợp ssh khác nhau cho các máy khác nhau.

Câu trả lời:


17

Các ~/.ssh/environmenttập tin có thể được sử dụng để biến thiết lập bạn muốn có sẵn cho các lệnh từ xa. Bạn sẽ phải kích hoạt PermitUserEnvironmenttrong cấu hình sshd.

Các biến được đặt theo cách này được xuất sang các tiến trình con, vì vậy bạn có thể:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

và myscript sẽ biết rằng Foo là Bar và Joe là 37.


3
biến cần thay đổi tiềm năng mỗi cuộc gọi ssh
Ross Rogers

1
Có thể tốt hơn để mô tả những gì bạn đang cố gắng làm và tại sao. Có thể có các giải pháp khác. Tệp môi trường sẽ phải được tạo động trên mỗi cuộc gọi ssh, điều này là không thể.
EmmEff

Điều gì sẽ thay đổi? Các giá trị của các biến đó hoặc thậm chí tên của chúng?
innaM

2
Câu trả lời này dường như không thực sự trả lời câu hỏi.
trực giác

1
Điều này sẽ bị phá vỡ nếu hai quá trình đang cố gắng thực hiện điều này với các bộ giá trị khác nhau đồng thời
nafg

55

Các SendEnvtùy chọn là chàng trai của bạn.

~ / .ssh / config: (cục bộ)

SendEnv MYVAR

/ etc / ssh / sshd_config: (ở đầu xa)

AcceptEnv MYVAR

Bây giờ, bất kể giá trị của $MYVARcục bộ là gì, nó cũng có sẵn trong phiên từ xa.
Nếu bạn đăng nhập nhiều lần, mỗi phiên sẽ có bản sao riêng $MYVAR, với các giá trị có thể khác nhau.

~/.ssh/environmentcó nghĩa là cho các mục đích khác. Nó hoạt động như $ENVtập tin khi thực hiện các lệnh không shell từ xa.


6
cũng có thể được chuyển (hữu ích hơn) thông qua dòng lệnh như ssh myserver -o SendEnv="MYVAR", vì vậy bạn có thể làm cho nó động trong các tập lệnh.
Mike Campbell

31

Bạn có thể truyền các giá trị bằng một lệnh tương tự như sau:

ssh username@machine VAR=value cmd cmdargs

Bạn có thể kiểm tra với:

ssh machine VAR=hello env

Trên tcsh sau đây có vẻ hoạt động:

ssh machine "setenv VAR <value>; printenv"

Có vẻ như nó hoạt động tốt cho môi trường bash. Quá tệ Tôi đang ở trong một môi trường tcsh của công ty.
Ross Rogers

2
Làm thế nào tôi có thể sử dụng phiên tương tác?
luckydonald

1
Lưu ý rằng ví dụ đầu tiên chỉ hoạt động cho lệnh đầu tiên nếu bạn kết hợp các lệnh với nhau (với &&). Sử dụng bash, export VAR=value;thay vì setenv ở dạng thứ ba hoạt động cho trường hợp này.
contrebis

2
Đây là những gì tôi đã làm! Bất cứ nơi nào bạn đi, mang theo môi trường của bạn với bạn. Bạn có thể làm điều đó như thế : ssh user@host "$(<env_to_source.sh) command ..." . Trong env đến nguồn, tôi có export var=value ; các dòng riêng biệt (hãy nhớ dấu chấm phẩy).
Tomasz Gandor

@TomaszGandor: nhiều năm sau, vẫn hoàn hảo - cho phép tôi thậm chí vượt qua những thứ phức tạp như PROMPT_COMMAND trên đó mà không cần phải lo lắng về việc thoát :-) 1000 cảm ơn.
Red Pill

29

Ngoài ra còn có một hack khủng khiếp, khủng khiếp.

Nếu tập lệnh của bạn đang tiêu thụ biến ở đầu từ xa (nghĩa là bạn có thể đặt tên cho nó theo bất cứ thứ gì bạn muốn), bạn có thể lạm dụng các biến cục bộ. Bất kỳ biến nào của mẫu LC_ * sẽ được chuyển qua nguyên văn, không có yêu cầu cấu hình nào.

Ví dụ: chúng tôi có một loạt các máy chủ pháo đài tại một trong những khách hàng của tôi. Tôi ghét phải kết nối với nó, chỉ để kết nối với một máy chủ khác ... và một máy chủ khác ... mỗi lần. Tôi có một tập lệnh hoạt động giống như SSH, ngoại trừ việc nó thông minh.

Về cơ bản, nếu LC_BOUNCE_HOSTS được đặt, nó sẽ phân tách nó trên các khoảng trắng và bóc tách máy chủ đầu tiên. Sau đó, nó nảy qua và chạy cùng một kịch bản. Trên nút đích, danh sách này cuối cùng trống, vì vậy nó chạy lệnh. Tôi cũng có chế độ gỡ lỗi (rất tốt trong các sự cố mạng), được đặt bởi LC_BOUNCE_DEBUG. Vì ssh vượt qua tất cả những điều này cho tôi một cách kỳ diệu, tôi không phải làm bất cứ điều gì ngoài việc nhận ra phần cuối của danh sách máy chủ (mà tôi làm với một - tùy chọn).

Tôi cảm thấy bẩn mỗi khi tôi sử dụng nó, nhưng nó hoạt động ở mọi nơi tôi đã thử nó.


2
Tại sao bạn sẽ sử dụng một cái gì đó như thế thay vì ProxyCommandtùy chọn tích hợp của OpenSSH ? Chỉnh sửa của bạn ~/.ssh/configvà thêm một khối như Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhostvà để nó kết nối các kết nối của bạn cho bạn.
Kirk Strauser

1
Đối với đường hầm, nó không quá tệ. Đối với vv env, hai lý do: Một, PermitUserEn Môi trường yêu cầu quyền truy cập của quản trị viên để định cấu hình trên máy chủ để truyền trực tiếp chúng. Vượt qua họ qua dòng lệnh cũng thực sự khó khăn để thoát khỏi quyền. Hai, nhiều pháo đài phải được đưa qua, làm cho điều này phức tạp hơn một chút - đặc biệt là khi nó không rõ ràng từ máy chủ nguồn sẽ đi đến một máy chủ đích nào đó. Nói dễ dàng hơn: "nảy-ssh bast1 bast2 nodeX - rm -rf /" hơn là duy trì các tuyến đường cho dân số máy chủ đang phát triển trong một loạt các tệp ssh-config.
Jayson

Nắm bắt tốt !! Thật tuyệt vời và một chút bẩn thỉu !!
zw963

2
Điều này thật kinh khủng. Bravo. 👏
Pi Delport

1
Điều này thật tuyệt vời, cảm ơn! Tôi đã sử dụng nó cho một lần hack tuyệt vời hơn nữa ! :)
thắt lưng

1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

Trên bash tôi đã thử nghiệm với:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
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.