Nguồn tệp sau khi đăng nhập ssh giảm xuống để nhắc
Câu hỏi đơn giản: Làm cách nào để tự động tạo nguồn tệp từ xa trên máy chủ từ xa sau khi đăng nhập qua SSH thông qua máy chủ pháo đài?
Tôi cần tạo nguồn một tệp chứa danh sách các bí danh + chức năng do người dùng shell xác định trên máy chủ từ xa sau khi ssh-ing vào đó.
Tệp tồn tại trên lập bản đồ từ xa trong thư mục / tmp, ví dụ / tmp / my-rc
Tìm kiếm các bài đăng và internet khác mà tôi đã tìm thấy
ssh -t [email protected] 'source /tmp/my-rc; bash -l'
Vấn đề là tôi nhận được một thiết bị đầu cuối, nhưng không có bí danh nào được đặt vì đó là một trình bao bash mới '
Thiết nghĩ, nguồn nên được thực hiện sau khi gắn vỏ, đã thử bên dưới nhưng điều này cũng không hoạt động. Không có lỗi, tôi nhận được thiết bị đầu cuối nhưng không nghĩ rằng tệp có nguồn gốc (được xác minh bằng cách gửi lại thông báo giả từ tệp / tmp / my-rc)
ssh -t [email protected] 'bash -l; source /tmp/my-rc'
Thậm chí đã thử với '.' thay vì nguồn, không có may mắn.
Mọi sự giúp đỡ.
Lưu ý 1: Bash hoặc ZSH bất kỳ giải pháp shell nào sẽ làm được.
Lưu ý 2: actuall ssh thông qua một lệnh proxy tức là một máy chủ lưu trữ nhảy qua pháo đài (Chỉ cần đề cập nếu nó có liên quan)
Lưu ý 3: Tôi không có tài khoản của một hồ sơ rc hoặc bashrc hoặc thậm chí là một thư mục chính trên máy chủ từ xa.
Lưu ý 4: Lệnh chính xác mà tôi đã sử dụng để đăng nhập vào máy chủ an toàn là thông qua máy chủ lưu trữ pháo đài như bên dưới
ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122
Trả lời
Với bash
, bạn có thể làm:
ssh -t user@host '
PROMPT_COMMAND="source /tmp/my-rc
unset PROMPT_COMMAND
" exec bash --norc'
Điều này sẽ gây ra /tmp/my-rc
nguồn trước lời nhắc và chỉ lời nhắc đó vì chúng tôi đã hủy đặt PROMPT_COMMAND
sau đó.
Bạn sẽ muốn loại bỏ unset PROMPT_COMMAND
nếu /tmp/my-rc
thực sự kết thúc việc xác định nó.
Ở trên giả định rằng shell đăng nhập của người dùng từ xa là giống Bourne, nhưng bạn sẽ có thể điều chỉnh nó với hầu hết các loại shell khác (csh / rc / fish).
Cho rằng bạn có thể ghi vào máy chủ lưu trữ từ xa /tmp
, bạn có thể tạo một /tmp/myhome
thư mục trên đó, đặt hồ sơ và tệp khởi tạo shell của bạn ở đó, sau đó khởi động Zsh với ZDOTIDR
đặt thành /tmp/myhome
và Bash với HOME
đặt thành /tmp/myhome
.
Theo mặc định, Zsh tìm kiếm các tệp khởi tạo của nó $ZDOTDIR
, mặc định là $HOME
nếu ZDOTDIR
không được đặt.
Do đó, bạn có thể khởi động Zsh trên máy chủ từ xa như sau:
ssh -t user@host ZDOTDIR=/tmp/myhome zsh
Và Bash như:
ssh -t user@host HOME=/tmp/myhome bash
Tất nhiên bạn có thể sáng tạo với các tệp hồ sơ / khởi tạo của mình — ví dụ: sử dụng chúng để đặt HOME
thành một đường dẫn phù hợp hơn, tạo nguồn cho các tệp khác (nếu bạn tình cờ đã có tệp chấm ở đâu đó trên máy chủ từ xa), v.v.
Một ứng dụng tối thiểu của phương pháp này, cô đọng trong một lệnh, có thể là:
ssh -t user@host 'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
(Sử dụng mkdir -p ...
để ngăn lỗi hiển thị khi /tmp/myhome
đã tồn tại, ví dụ: nếu bạn đang kết nối lại với máy chủ từ xa và bạn đã biết thư mục ở đó).
Tính đến bạn ProxyCommand
, nó có thể là:
ssh -t -o ProxyCommand='ssh -W \
%h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
10.0.31.122 \
'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
Cuối cùng, về nỗ lực của bạn: ssh -t [email protected] 'bash -l; source /tmp/my-rc'
không hoạt động bởi vì source
lệnh chỉ được thực thi sau khi trình bao tương tác thoát ra.
Nếu UsePAM được đặt thành có trong tệp sshd_config của máy chủ từ xa, thì tệp cấu hình /etc/pam.d/sshd cho phép bạn tự động hóa việc thực thi lệnh khi đăng nhập thành công, trong số các sự kiện khác trong quá trình xác thực. Thêm dòng mã này
session required pam_exec.so /etc/myscripts/./sourcing-script
ngay trên những dòng này
# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context. Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
where / etc / myscripts / chuacing-script đơn giản là một tệp trên máy chủ từ xa có lệnh thực thi khi đăng nhập thành công.
#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log
Tôi sử dụng phương pháp này để dừng một dịch vụ và báo cáo nó vào tệp nhật ký, trước khi phiên ssh của tôi được mở. Trước khi đăng xuất, tôi đặt crontab để bắt đầu dịch vụ, vì vậy nó không bao giờ chạy song song với phiên ssh của tôi.
Thông thường, bạn làm điều này trong $HOME/.profile
hoặc các biến thể.
ssh
đặt các biến môi trường bắt đầu bằng SSH_
, bạn có thể sử dụng các biến đó để xác định xem bạn đã đăng nhập qua ssh
hay trực tiếp.