Nie mogę ustawić nowej zmiennej $ PATH tak, aby była używana podczas wykonywania poleceń za pośrednictwem ssh user@host command
. Próbowałem dodać export PATH=$PATH:$HOME/new_path
do ~ / .bashrc i ~ / .profile na zdalnej maszynie, ale wykonanie ssh user@host "echo \$PATH"
pokazuje, że zmiana nie została odebrana (pokazuje / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). Na zdalnym komputerze działa Ubuntu 8.04.
Jestem pewien, że mógłbym włamać się do / etc / profile, ale nie jest to czyste rozwiązanie i działa tylko wtedy, gdy ma się uprawnienia administratora.
export PATH=$PATH:$HOME/new_path
zarówno ~ / .bash_login, jak i ~ / .bash_profile (oprócz wcześniej wypróbowanych ~ / .bashrc i ~ / .profile). Ani jedno, ani drugie nie działa. W obu przypadkach musiałem stworzyć plik.Odpowiedzi:
Jak powiedział grawity, ~ / .bashrc jest tym, czego potrzebujesz, ponieważ jest pozyskiwane z nieinteraktywnych powłok niezalogowanych.
Spodziewam się, że problem, który masz, dotyczy domyślnego pliku Ubuntu ~ / .bashrc. Zwykle zaczyna się od czegoś takiego:
# If not running interactively, don't do anything [ -z "$PS1" ] && return
Chcesz umieścić cokolwiek dla powłok nieinteraktywnych przed tą linią.
źródło
export PATH=$PATH:$HOME/new_path
powyżej tej linii i zadziałało. Dzięki!.zshenv
dla zsh użytkowników, zajęło mi trochę czasu, aby znaleźć go w komentarzach na innych odpowiedziCzy masz
~/.bash_login
lub~/.bash_profile
?Bash w trybie interaktywnym sprawdza te pliki i używa pierwszego istniejącego w następującej kolejności:
~/.bash_profile
~/.bash_login
~/.profile
Więc jeśli masz
~/.bash_profile
, to wszelkie zmiany, które~/.profile
wprowadzisz, pozostaną niewidoczne.Bash w trybie nieinteraktywnym czasami odczytuje plik
~/.bashrc
(który jest również często pobierany ze skryptów interaktywnych). Przez „czasami” mam na myśli, że jest zależny od dystrybucji: dość dziwne, jest opcja włączania tego w czasie kompilacji . Debian umożliwia~/.bashrc
odczyt, podczas gdy np. Arch nie.ssh
wydaje się używać trybu nieinteraktywnego,więc~/.bashrc
powinno wystarczyć. Kiedy mam takie problemy, zwykle dodaję kilka ech, aby zobaczyć, jakie pliki są uruchamiane.źródło
~/.bashrc
”? Nie widzę tego stwierdzenia na stronie podręcznika. Dzięki~/.bashrc
była nieinteraktywna powłoka niezalogowana , wydaje się, że musisz dodatkowo ustawić zmienną środowiskowąBASH_ENV
; patrz superuser.com/a/585699/100843 . W przypadku nieinteraktywnych powłok logowania prawdopodobnie musiałbyś zmodyfikować jeden z trzech wymienionych skryptów startowych..zshenv
.zshenv
zawsze pochodzi; nie ma znaczenia, czy jest interaktywny, czy nie.Dokumentacja ssh mówi:
dlatego nie działa dodawanie do plików bashrc. masz jednak następujące możliwości:
Jeśli
PermitUserEnvironment
opcja jest ustawiona w konfiguracji sshd, możesz dodać ustawienie PATH do~/.ssh/environment
ssh remotemachine 'bash -l -c "somecommand"'
źródło
man sshd_config
mówi, że jest domyślnie wyłączony, więc jest mało prawdopodobne, że to rozwiązanie zadziała dla większości ludzi. 2. To by zadziałało, ale nie mogę łatwo zmodyfikować polecenia wysłanego do ssh (patrz drugi komentarz do mojego pytania).Zawsze możesz powiedzieć:
ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
źródło
Oprócz odpowiedzi @signpolyma, będziesz musiał dodać swój eksport przed tymi liniami
# If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac
źródło
Po prostu miałem ten sam problem, rozwiązałem go za pomocą:
ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
źródło