SSH - đặt env vairabled theo mọi kết nối - máy chủ chia sẻ godaddy


16

Vấn đề của tôi là, tôi phải đặt các biến env (như GIT_EXEC_PATH) trên máy chủ. Tôi cần các biến đó theo mọi kết nối (do bash và các lệnh từ xa). Tôi đã quản lý để đặt các biến đó bằng cách bash với .bash_profile, nhưng tôi gặp vấn đề với các lệnh từ xa. Tôi thấy rằng có thể viết lệnh trong ~ / .ssh / ủy quyền trước khóa rsa thực tế, nhưng tôi không muốn viết ở đó luôn, tôi cần một giải pháp lâu dài ... Tôi thấy rằng ~ / .ssh / tệp RC được thực thi bởi mỗi lần đăng nhập ssh, vì vậy tôi đặt ở đó các khai báo biến env của mình, nhưng nó không hoạt động. Các biến được đặt trong tệp RC, nhưng sau đó chúng biến mất. : S Có thể tệp RC chạy trong một khung con: S Có cách nào để xác định các biến đó trong bash và trong các lệnh từ xa mà không cần sao chép mã không?

Biên tập:

Tôi đã chỉnh sửa câu hỏi, bởi vì máy chủ là một máy chủ chia sẻ thần thánh, vì vậy nó có một cấu hình duy nhất. Các tập tin / etc / ssh / sshd_config và / etc / ssh / ssh_config đều trống. Có những bình luận trong những tập tin đó, nếu bạn tò mò tôi có thể sao chép nó ở đây.

  1. ~ / .Bash_profile có nguồn gốc (chỉ bằng các kết nối bash),
  2. ~ / .bashrc không bao giờ có nguồn gốc,
  3. ~ / .profile không bao giờ có nguồn gốc,
  4. ~ / .ssh / môi trường không bao giờ có nguồn gốc,
  5. ~ / .ssh / rc có nguồn gốc (bởi bash và remote cả hai), nhưng tôi nghĩ nó được gọi trong subshell, bởi vì các biến biến mất.
  6. Mọi lúc ~ / .ssh / ủy quyền đều có nguồn gốc, nhưng tôi phải viết các lệnh trước mỗi khóa rsa (vì vậy tôi sẽ không định cấu hình với điều đó).

Tóm lược:

Tôi có thể định cấu hình bash tốt (với .bash_profile), nhưng tôi không thể định cấu hình các cuộc gọi từ xa. Đó chính là vấn đề. Tôi đang tìm kiếm một tập tin có nguồn gốc từ cả hai lệnh bash và remote.

Ví dụ:

Lệnh git-upload-pack tìm thấy tệp exe, bởi vì biến env GIT_EXEC_PATH được đặt, nhưng với điều khiển từ xa: "git clone user@domain.com: myrepo local / myrepo" máy chủ không tìm thấy lệnh đó, vì GIT_EXEC_PATH không được đặt.

Chỉnh sửa2:

Theo đó , và bản ghi printenv của tôi: ~ / .ssh / rc đang chạy trong vỏ bình thường, không phải trong subshell, vì vậy đó là một câu đố tại sao các biến env không dính ...

Tôi đã tạo một tệp thực thi: ~ / logenv :

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

Và đặt cái này vào ~ / .ssh / rc :

export AAA=teszt
source ~/logenv

Bằng cách đăng nhập bash & "nguồn logenv" , kết quả là:

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

Bằng cách từ xa "ssh myuser@domain.com 'exec ~ / logenv'" kết quả là:

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

Vì vậy, tập tin RC có nguồn gốc, nhưng sau đó các biến không đồng ý ...: S


Một số tùy chọn trong chuỗi này - stackoverflow.com/questions/216202/
Kiếm

"Không giống như / etc / sshrc, luôn được xử lý bởi trình bao Bourne (/ bin / sh), tệp RC của bạn được xử lý bởi trình đăng nhập thông thường của tài khoản của bạn." - điều đó thật lạ bởi vì có vẻ như nó sẽ không có nguồn gốc từ vỏ bình thường: S
inf3rno

Câu trả lời:


12

Giả sử bạn có UsePAM yestrong /etc/ssh/sshd_config, và giả sử bạn muốn các biến môi trường đặt ra cho mỗi người dùng, bạn có thể có các biến môi trường pam bộ cho bạn. Nếu bạn có các biến môi trường được xác định trong, /etc/gitenvbạn có thể thêm dòng này vào/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

Hoặc bằng cách kiểm tra tệp này, bạn có thể thấy rằng đã có pam_env.so đang được sử dụng và đã có tệp bạn có thể thêm nội dung vào. Chỉ cần cẩn thận và đảm bảo rằng bạn đã kiểm tra kỹ lưỡng các thay đổi của mình trước khi kết thúc phiên ssh của mình, vì khi bạn gặp rắc rối với pam, bạn hoàn toàn có thể phá vỡ khả năng đăng nhập vào máy chủ của mình, nếu không cẩn thận.


Tôi có một tài khoản máy chủ chia sẻ godaddy, vì vậy tôi chỉ có thể sửa đổi thư mục ~. (Nó có hệ thống op centos.)
inf3rno

@ inf3rno nó không gây hại cho upvote câu trả lời tốt :) vì dù sao giải pháp sẽ giải quyết vấn đề của bạn có thể được đánh dấu bằng một ý nghĩa khác.
Huygens

Đồng ý. Tôi sẽ, nhưng tôi không phải là người duy nhất có thể bỏ phiếu ... :-)
inf3rno

Trên Ubuntu, dường như có /etc/environmentnguồn gốc pam_env.sotheo mặc định
RCoup

4

Tôi đang thiết lập một số biến môi trường cho các kết nối SSH của mình bằng cách sử dụng ~/.ssh/environment. Các tập tin có thể chứa biến trong biểu mẫu VAR=value, không cần phải xuất chúng một cách rõ ràng.

Tuy nhiên, tệp cấu hình người dùng này bị bỏ qua theo mặc định bởi quy trình máy chủ SSH trừ khi tùy chọn PermitUserEn Môi trường được đặt thành có. Do đó, bạn cần đảm bảo chỉnh sửa / etc / sshd_config trên máy chủ SSH để thêm hoặc cập nhật tham số này:

PermitUserEnvironment yes

Bạn cần tải lại cấu hình máy chủ SSH. Trên RHEL hoặc Suse Linux bạn làm (với quyền root)

/sbin/service sshd reload

(Có thể thay thế sshd bằng ssh nếu nó không hoạt động)

Trên Ubuntu (sử dụng mới bắt đầu) bạn làm

sudo reload ssh

Trên bất kỳ Linux nào khác, bạn có thể thử (với quyền root)

/etc/init.d/sshd reload

(Thay thế sshd bằng ssh hoặc openssh hoặc bất cứ điều gì tương ứng với tập lệnh init của máy chủ SSH)


Cảm ơn, nhưng tôi không thể viết trong thư mục / etc, môi trường ~ / .ssh / không có nguồn gốc.
inf3rno

2

Tôi không còn là máy chủ lưu trữ chia sẻ nữa, vì vậy tôi không thể kiểm tra xem các giải pháp được đề xuất có hợp lệ hay không. Điều này sẽ ở lại câu trả lời được chấp nhận, vì nó hoạt động khi tôi đặt câu hỏi. Các câu trả lời khác có thể làm việc là tốt. Tôi để cho cộng đồng quyết định rằng với upvotes.

Đồng ý. Giải pháp là không có giải pháp nào trên máy chủ chia sẻ godaddy. Tôi đã thử tất cả mọi thứ, nhưng không có gì hoạt động, vì vậy tôi quyết định rằng tôi sẽ ở lại với ~ / .ssh / ủy quyền:

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

Trong ~ / connect.sh:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

Và trong ~ / .env_profile:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

Vì vậy, tôi phải sao chép lệnh = "..." vào mọi khóa rsa trong ủy quyền. Đây là sao chép mã, nhưng tôi không nghĩ rằng có một giải pháp khác trên máy chủ chia sẻ chung.


1

Nếu bạn đang sử dụng bashlàm vỏ của mình, hãy thử thêm cài đặt môi trường vào .bashrc.

Trước tiên hãy kiểm tra xem cái này có được chạy khi đăng nhập không, vì nó có thể không phải là các tệp tiêu chuẩn thường có nội dung như:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

khi bắt đầu chúng. bất kỳ thay đổi nào bạn muốn thực hiện ngay cả đối với thông tin đăng nhập không tương tác sẽ cần phải vượt lên trên tuyên bố như vậy.

.profilelà một vị trí tổng quát hơn để đặt cấu hình như thế này và được hầu hết các shell (trong thiết lập Debian mặc định, đó là ~/.profilecuộc gọi ~/.bashrcở vị trí đầu tiên). Bạn có thể cần phải chỉnh sửa cẩn thận hơn .profiletrong trường hợp nó được giải thích bởi các shell khác - tức là cố gắng tránh sử dụng bashcác tiện ích mở rộng cụ thể.

Biên tập

Nếu bạn có một .bash_profilechỉnh sửa thay vì .profile: bash sẽ sử dụng nó theo hướng có lợi cho tệp chung hơn và bạn có thể sử dụng bash những thứ cụ thể trong đó một cách an toàn.


Đọc phần "Chỉnh sửa". (.profile không hoạt động)
inf3rno

1

Bạn có thể sử dụng lệnh cho tất cả người dùng / khóa mà không cần thêm phần lệnh trong ủy quyền bằng cách thêm dòng này vào tệp sshd_config:

ForceCommand ~/connect.sh

Trong trường hợp này tôi khuyên bạn nên sử dụng một đường dẫn tuyệt đối cho tập lệnh


0

Tôi đang đề xuất cho bạn một cách tiếp cận khác.

Bạn thiết lập một tệp với khai báo biến môi trường của bạn và sau đó bạn nguồn nó mỗi khi bạn gọi một lệnh từ xa.

Ví dụ: bạn đặt các biến cần thiết vào ~ / .my_var.rc và sau đó cho mỗi lệnh từ xa bạn làm ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Nếu điều này phù hợp với bạn, thì bạn có thể tinh chỉnh khái niệm này và viết kịch bản cho thuận tiện. Nếu bạn chỉ cần nó cho các lệnh git, thì tôi sẽ tạo một tập lệnh git.sh sẽ làm điều này:

#!/bin/bash

source ~/.my_var.rc

git $@

Giả sử tập lệnh này sẽ có trong thư mục nhà của bạn, bạn sẽ gọi nó: ssh user@remote git.sh pull origin master

Lưu ý: đó là một điểm khởi đầu đơn giản. Ví dụ, nó không hỗ trợ các tham số với khoảng trắng.


Tôi có thể làm điều đó, nhưng cấu hình đó không dành cho riêng tôi và nó sẽ hoạt động với git gui nơi các lệnh được tạo tự động ...
inf3rno

Bạn có kết nối với ssh từ xa bằng cùng một người dùng không? Nếu có, thì tệp ~ / .my_var.rc sẽ là người dùng cụ thể và git.sh chung cho tất cả. Nếu không, thì bạn có thể thêm một tham số phụ vào git.sh có thể giúp bạn phân biệt tệp .rc nào với nguồn (hoặc sử dụng IP cố định, bạn có thể sử dụng thông tin env SSH_CLIENT để phân biệt người dùng của mình). Lệnh nên hoạt động với git gui, gọissh -Y user@remote git.sh gui
Huygens

Tôi cần các cài đặt env giống nhau cho mọi người dùng. Tôi sẽ không thêm phần bổ sung vào các lệnh, thật vô lý ...
inf3rno

Vậy thì nếu các cài đặt giống nhau cho tất cả người dùng thì câu trả lời đã hoàn tất và bạn có thể bỏ qua nhận xét trước đó của tôi. Bạn có thể sẽ cần phải đặt các tệp .rc và .sh trong một thư mục chung cho / người dùng có thể truy cập.
Huygens

@ inf3rno nếu bạn muốn có nhiều câu trả lời hơn, bạn nên cảm ơn những người đã đề xuất câu trả lời tốt, ngay cả khi không áp dụng cho trường hợp của bạn vì thông tin bị thiếu trong câu hỏi ban đầu. Hoặc mọi người sẽ không cố gắng.
Huygens

0

Điều này không trả lời câu hỏi chung về PATHS, nhưng nó cho phép bạn sử dụng kho git trên máy chủ từ xa không có git trong đường dẫn của nó và bạn không có quyền truy cập root. Giải pháp này xuất phát từ trang này .

git clone -u relative/path/to/bin/git-upload-pack username@host.com:relative/path/to/remote_repository.git

Để cũng đẩy và tìm nạp:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack

0

/ etc / profile sẽ có nguồn gốc trên mỗi kết nối với ssh-client.


Chỉ dành cho shell đăng nhập.
RalfFriedl
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.