Làm cách nào để tôi đặt $ PATH sao cho `ssh user @ host lệnh` hoạt động?


129

Tôi dường như không thể thiết lập $ PATH mới sao cho nó được sử dụng khi thực hiện các lệnh thông qua ssh user@host command. Tôi đã thử thêm export PATH=$PATH:$HOME/new_pathvào ~ / .bashrc và ~ / .profile trên máy từ xa, nhưng thực thi ssh user@host "echo \$PATH"cho thấy thay đổi chưa được chọn (nó hiển thị / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). Máy từ xa đang chạy Ubuntu 8.04.

Tôi chắc chắn rằng tôi có thể hack nó vào / etc / profile, nhưng đó không phải là một giải pháp sạch và nó chỉ hoạt động khi có quyền truy cập root.


1
Tôi đã thử thêm export PATH=$PATH:$HOME/new_pathvào cả ~ / .bash_login và ~ / .bash_profile (ngoài ~ / .bashrc và ~ / .profile đã thử trước đó). Không hoạt động. Trong cả hai trường hợp tôi phải tạo tập tin.
Denver Gingerich

Trong trường hợp sử dụng cụ thể của tôi, không dễ để sửa đổi lệnh được gửi đến ssh. Tôi đang sử dụng stfufs ( guru-group.fi/too/sw/stfufs ), để xây dựng lệnh ssh chính nó. Tôi nhận ra phương pháp của nó không phải là một giải pháp tuyệt vời, nhưng sẽ rất tốt nếu sửa nó mà không sửa đổi stfufs.
Denver Gingerich

Bạn có thể đặt một trình bao bọc ssh theo cách của stfufs, gọi ssh thực với các đối số đã được sửa đổi, nếu điều đó dễ dàng hơn
Hasturkun

Câu trả lời:


179

Như grawity đã nói, ~ / .bashrc là những gì bạn muốn, vì nó có nguồn gốc từ các vỏ không đăng nhập không tương tác.

Tôi hy vọng vấn đề bạn gặp phải với tệp Ubuntu ~ / .bashrc mặc định. Nó thường bắt đầu với một cái gì đó như thế này:

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

Bạn muốn đặt bất cứ điều gì cho shell không tương tác trước dòng này.


1
Đúng, tôi đã di chuyển dòng export PATH=$PATH:$HOME/new_pathtrên và nó hoạt động. Cảm ơn!
Denver Gingerich

3
.bashrc không đáng tin cậy. man bash: "Bash cố gắng xác định khi nào nó đang được chạy với đầu vào tiêu chuẩn được kết nối với kết nối mạng". Điều này hoạt động trên RHEL, nhưng không phải trên Archlinux. Tôi đã phải chỉnh sửa / etc / môi trường để thay đổi PATH mặc định
lưu vực

Bạn nên thêm đề cập đến .zshenvcho người dùng zsh, tôi đã mất khá nhiều thời gian để tìm thấy nó trong các nhận xét về các câu trả lời khác
Mike

30

Bạn có ~/.bash_loginhay ~/.bash_profilekhông?

Bash trong chế độ tương tác kiểm tra các tệp này và sử dụng tệp hiện có đầu tiên , theo thứ tự sau:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Vì vậy, nếu bạn có một ~/.bash_profile, thì bất kỳ thay đổi nào bạn làm ~/.profilesẽ không được nhìn thấy.

Bash trong chế độ không tương tác đôi khi đọc tệp ~/.bashrc(cũng thường là nguồn từ các tập lệnh tương tác.) Bởi "đôi khi" Tôi có nghĩa là nó phụ thuộc vào phân phối: khá kỳ lạ, có một tùy chọn thời gian biên dịch để cho phép điều này . Debian cho phép ~/.bashrcđọc, trong khi vd Arch thì không.

ssh dường như đang sử dụng chế độ không tương tác, như vậy ~/.bashrclà đủ Khi gặp vấn đề như thế này, tôi thường thêm một vài tiếng vang để xem tập tin nào đang được chạy.


Thêm tiếng vang đã giúp ... nhưng tôi vẫn đang theo đuổi cách thực hiện 'ssh -X remotemachine "xterm"' và có đường dẫn hệ thống / người dùng đầy đủ từ / etc / profile và ~ / home / username / .bash_profile. Nếu tôi nguồn cả hai tập tin trong lệnh, nó hoạt động .. nhưng nó xấu xí :).
Jess

Làm thế nào để bạn biết rằng "Bash trong chế độ không tương tác đọc tệp ~/.bashrc"? Tôi không thấy tuyên bố này trong trang web. Cảm ơn
nknight

4
Nếu bạn muốn một vỏ không đăng nhập không tương tác với nguồn ~/.bashrc, có vẻ như bạn cần đặt thêm biến môi trường BASH_ENV; xem superuser.com/a/585699/100843 . Đối với các shell đăng nhập không tương tác, có lẽ bạn phải sửa đổi một trong ba tập lệnh khởi động mà bạn đã đề cập.
nknight

3
Đối với ZSH, tệp không tương tác là:.zshenv
math

2
@math .zshenvluôn có nguồn gốc; nó không quan trọng nếu nó tương tác hay không.
JoL

19

tài liệu ssh nói:

Nếu lệnh được chỉ định, nó được thực thi trên máy chủ từ xa thay vì vỏ đăng nhập.

đó là lý do tại sao việc thêm vào các tệp bashrc không hoạt động. tuy nhiên bạn có các tùy chọn sau:

  1. Nếu PermitUserEnvironmenttùy chọn được đặt trong cấu hình sshd, bạn có thể thêm cài đặt PATH của mình vào~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'


1. Nó không được đặt trong cấu hình sshd của tôi và man sshd_confignói rằng nó bị tắt theo mặc định nên không có khả năng giải pháp này sẽ hiệu quả với hầu hết mọi người. 2. Điều này sẽ hoạt động, nhưng tôi không thể dễ dàng sửa đổi lệnh được gửi đến ssh (xem bình luận thứ hai về câu hỏi của tôi).
Denver Gingerich

1
1. Không hoạt động như mong đợi, vì trong ~ / .ssh / môi trường, bạn không thể thêm đường dẫn vào PATH, vì $ PATH sẽ không được giải quyết.
not2savvy

8

Bạn luôn có thể nói:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

Giải pháp này không cần bất kỳ thay đổi nào trên máy từ xa, đây là một điều tốt.
Ronny Andersson

2

Ngoài câu trả lời @signpolyma, bạn sẽ phải thêm bản xuất của mình trước những dòng này

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Tôi thực sự chỉ nhận xét những dòng này hoàn toàn - được tìm thấy trong ~ / .bashrc trong máy tính để bàn Ubuntu 16.04 LTS. Không có mọi thứ hoạt động. Đồng thời đặt PermitUserEn Môi trường thành có.
Ernie S

2

Chỉ có vấn đề tương tự bản thân tôi, giải quyết nó với:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
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.