Bagaimana cara mengatur $ PATH sehingga `ssh user @ host command` berfungsi?

129

Sepertinya saya tidak dapat menetapkan $ PATH baru sehingga digunakan saat menjalankan perintah melalui ssh user@host command. Saya telah mencoba menambahkan export PATH=$PATH:$HOME/new_pathke ~ / .bashrc dan ~ /. Profil pada mesin remote, tetapi mengeksekusi ssh user@host "echo \$PATH"menunjukkan bahwa perubahan belum diambil (ini menunjukkan / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). Mesin jarak jauh menjalankan Ubuntu 8.04.

Saya yakin saya bisa meretasnya ke / etc / profile, tapi itu bukan solusi bersih dan hanya berfungsi ketika seseorang memiliki akses root.

Denver Gingerich
sumber
1
Saya telah mencoba menambahkan export PATH=$PATH:$HOME/new_pathke ~ / .bash_login dan ~ / .bash_profile (sebagai tambahan pada ~ / .bashrc dan ~ / .profile) yang telah dicoba sebelumnya. Tidak ada yang berhasil. Dalam kedua kasus saya harus membuat file.
Denver Gingerich
Dalam kasus penggunaan khusus saya, tidak mudah untuk memodifikasi perintah yang dikirim ke ssh. Saya menggunakan stfufs ( guru-group.fi/too/sw/stfufs ), yang membangun perintah ssh itu sendiri. Saya menyadari metodenya bukan solusi yang bagus, tetapi akan menyenangkan untuk memperbaikinya tanpa memodifikasi stfufs.
Denver Gingerich
Anda bisa meletakkan ssh wrapper di jalan stfufs, panggil ssh asli dengan args yang dimodifikasi, jika itu lebih mudah
Hasturkun

Jawaban:

179

Seperti yang dikatakan grawity, ~ / .bashrc adalah yang Anda inginkan, karena bersumber dari shell non-login non-interaktif.

Saya perkirakan masalah yang Anda alami berkaitan dengan file default Ubuntu ~ / .bashrc. Biasanya dimulai dengan sesuatu seperti ini:

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

Anda ingin meletakkan apa pun untuk cangkang non-interaktif sebelum baris ini.

singpolyma
sumber
1
Yap, saya pindah di export PATH=$PATH:$HOME/new_pathatas garis itu dan berhasil. Terima kasih!
Denver Gingerich
3
.bashrc tidak dapat diandalkan. man bash: "Bash mencoba untuk menentukan kapan sedang dijalankan dengan input standar yang terhubung ke koneksi jaringan". Ini berfungsi pada RHEL, tetapi tidak pada Archlinux. Saya harus mengedit / etc / environment untuk mengubah PATH default
basin
Anda harus menambahkan menyebutkan .zshenvuntuk pengguna zsh, butuh waktu cukup lama untuk menemukannya di komentar pada jawaban lain
Mike
30

Anda punya ~/.bash_loginatau tidak ~/.bash_profile?

Bash dalam mode interaktif memeriksa file-file ini, dan menggunakan yang sudah ada , dalam urutan ini:

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

Jadi, jika Anda memiliki ~/.bash_profile, maka perubahan apa pun yang Anda lakukan ~/.profileakan dibiarkan tidak terlihat.

Bash dalam mode non-interaktif kadang-kadang membaca file ~/.bashrc(yang juga sering berasal dari skrip interaktif). Dengan "kadang-kadang" yang saya maksudkan adalah ketergantungan distribusi: anehnya, ada opsi waktu kompilasi untuk mengaktifkan ini . Debian memungkinkan ~/.bashrcpembacaan, sedangkan misalnya Arch tidak.

ssh tampaknya menggunakan mode non-interaktif, jadi ~/.bashrcsudah cukup. Ketika mengalami masalah seperti ini, saya biasanya menambahkan beberapa gema untuk melihat file apa yang sedang dijalankan.

pengguna1686
sumber
Menambahkan gema membantu ... tapi saya masih mengejar cara untuk menjalankan 'ssh -X remotemachine "xterm"' dan memiliki jalur sistem / pengguna penuh dari / etc / profile dan ~ / home / username / .bash_profile. Jika saya sumber kedua file dalam perintah, itu berfungsi .. tetapi jelek:).
Jess
Bagaimana Anda tahu bahwa "Bash dalam mode non-interaktif membaca file ~/.bashrc"? Saya tidak melihat pernyataan ini di halaman manual. Terima kasih
nknight
4
Jika Anda ingin shell non-login non-interaktif untuk sumber ~/.bashrc, tampaknya Anda perlu mengatur variabel lingkungan tambahan BASH_ENV; lihat superuser.com/a/585699/100843 . Untuk shell login non-interaktif, Anda mungkin harus memodifikasi salah satu dari tiga skrip startup yang Anda sebutkan.
nknight
3
Untuk ZSH file non-interaktif adalah:.zshenv
math
2
@math .zshenvselalu bersumber; tidak masalah apakah itu interaktif atau tidak.
JoL
19

Dokumentasi ssh mengatakan:

Jika perintah ditentukan, ini dijalankan pada host jarak jauh alih-alih shell login.

itulah sebabnya menambahkan ke file bashrc tidak berfungsi. Namun Anda memiliki opsi berikut:

  1. Jika PermitUserEnvironmentopsi ini diatur dalam konfigurasi sshd, Anda dapat menambahkan pengaturan PATH Anda~/.ssh/environment

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

Hasturkun
sumber
1. Ini tidak diatur dalam konfigurasi sshd saya dan man sshd_configmengatakan tidak aktif secara default sehingga tidak mungkin solusi ini akan bekerja untuk kebanyakan orang. 2. Ini akan berhasil, tetapi saya tidak dapat dengan mudah memodifikasi perintah yang dikirim ke ssh (lihat komentar kedua pada pertanyaan saya).
Denver Gingerich
1
1. Tidak berfungsi seperti yang diharapkan, karena di ~ / .ssh / environment, Anda tidak dapat menambahkan path ke PATH, karena $ PATH tidak akan diselesaikan.
not2savvy
8

Anda selalu bisa mengatakan:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
Chas. Owens
sumber
Solusi ini tidak memerlukan perubahan pada mesin jarak jauh, yang merupakan hal yang baik.
Ronny Andersson
2

Selain jawaban @signpolyma, Anda harus menambahkan ekspor Anda sebelum baris ini

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Selamat Coding
sumber
Saya sebenarnya hanya berkomentar garis-garis ini sama sekali - ditemukan di ~ / .bashrc di desktop Ubuntu 16.04 LTS. Tidak semuanya berfungsi. Juga atur PermitUserEnvironment ke ya.
Ernie S
2

Hanya memiliki masalah yang sama sendiri, menyelesaikannya dengan:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Indie
sumber