2009-06-02 4 views
112

Nie mogę ustawić nowej zmiennej $ PATH tak, aby była używana podczas wykonywania poleceń przez ssh [email protected] command. Próbowałem dodać export PATH=$PATH:$HOME/new_path do ~/.bashrc i ~/.profile na zdalnym komputerze, ale wykonanie ssh [email protected] "echo \$PATH" pokazuje, że zmiana nie została pobrana (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 mogę zhakować go w/etc/profile, ale to nie jest czyste rozwiązanie i działa tylko wtedy, gdy ma się uprawnienia administratora.

+0

próbowałem dodanie ' export PATH = $ PATH: $ HOME/new_path' do obu ~/.bash_login i ~/.bash_profile (oprócz poprzednio wypróbowanych ~/.bashrc i ~/.profile). Ani działa. W obu przypadkach musiałem stworzyć plik. –

+0

W moim konkretnym przypadku użycia, nie jest łatwo zmodyfikować polecenie wysłane do ssh. Używam stfufs (http://www.guru-group.fi/too/sw/stfufs/), który konstruuje samą komendę ssh. Rozumiem, że jego metoda nie jest świetnym rozwiązaniem, ale byłoby fajnie to naprawić bez modyfikowania stfufs. –

+0

Możesz umieścić ssh wrapper w sposób stfufs, wywoływać prawdziwe ssh ze zmodyfikowanymi args, jeśli to łatwiejsze – Hasturkun

Odpowiedz

152

Jak grawity powiedział PATH ~/.bashrc jest tym, czego potrzebujesz, ponieważ pochodzi z nieinteraktywnych powłok niezalogowanych.

Oczekuję, że problem, który masz, ma związek z domyślnym plikiem Ubuntu ~/.bashrc.Zwykle zaczyna się coś takiego:

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

Chcesz umieścić coś dla nieinterakcyjnych muszli przed tej linii.

+1

Tak, przesunąłem 'export PATH = $ PATH: $ HOME/new_path' powyżej tej linii i zadziałało. Dzięki! –

+2

.bashrc jest niewiarygodny. man bash: "Bash próbuje określić, kiedy jest uruchamiany ze standardowym wejściem podłączonym do połączenia sieciowego". Działa na RHEL, ale nie na Archlinuksie. Musiałem edytować/etc/environment, aby zmienić domyślną ścieżkę PATH – basin

6

Zawsze można powiedzieć:

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

To rozwiązanie nie wymaga żadnych zmian na zdalnym komputerze, co jest dobre. –

29

Czy masz ~/.bash_login lub ~/.bash_profile?

atakujących w interaktywnych kontroli tryb dla tych plików i używa pierwszy istniejący, w tej kolejności:

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

więc jeśli mieć ~/.bash_profile, a następnie wszelkie zmiany, które wprowadzisz na ~/.profile pozostanie niezauważone.

atakujących w trybie nieinteraktywnym czasami odczytuje plik ~/.bashrc (który jest również często source'd z interaktywnych skryptów.) Przez „czasami” to znaczy, że jest to dystrybucja zależne: dość dziwnie, istnieje opcja kompilacji dla włączenia tej opcji. Debian umożliwia odczytanie ~/.bashrc, np. Arch nie.

ssh wydaje się być w trybie nieinteraktywnym, , więc ~/.bashrc powinno wystarczyć. Mając takie problemy, zazwyczaj dodajemy kilka ech, aby zobaczyć, jakie pliki są uruchamiane.

+0

Dodanie echa pomogło ... ale wciąż ścigam sposób na wykonanie 'ssh -X remotemachine "xterm"' i mam pełną ścieżkę system/użytkownika z/etc/profile i ~/home/username/.bash_profile . Jeśli źródło obu plików jest w poleceniu, działa, ale jest brzydkie:). – Jess

+0

Skąd wiadomo, że "Bash w trybie nieinteraktywnym odczytuje plik' ~/.bashrc' "? Nie widzę tego stwierdzenia na stronie podręcznika. Dzięki – nknight

+3

Jeśli chcesz, aby nieinteraktywna powłoka bez logowania pochodziła z '~/.bashrc', wydaje się, że musisz dodatkowo ustawić zmienną środowiskową' BASH_ENV'; zobacz http://superuser.com/a/585699/100843. W przypadku nieinteraktywnych powłok logowania prawdopodobnie trzeba będzie zmodyfikować jeden z trzech wymienionych skryptów startowych. – nknight

18

dokumentację ssh mówi:

Jeśli komenda jest określony, to jest wykonywane na zdalnym komputerze zamiast powłoki logowania.

dlatego dodawanie do plików bashrc nie działa. Ci mają jednak następujące opcje:

  1. Jeśli opcja PermitUserEnvironment jest ustawione w config sshd, można dodać ustawienie ~/.ssh/environment

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

+0

1. To nie jest ustawione w mojej konfiguracji sshd i 'man sshd_config' mówi, że jest domyślnie wyłączone, więc jest mało prawdopodobne, aby to rozwiązanie działało dla większości ludzi. 2. To zadziałałoby, ale nie mogę łatwo zmodyfikować polecenia wysłanego do ssh (patrz drugi komentarz na moje pytanie). –

+1

1. Nie działa zgodnie z oczekiwaniami, ponieważ w ~/.ssh/environment, nie można dodać pathes do PATH, ponieważ $ PATH nie zostanie rozwiązany. – not2savvy

2

Oprócz @signpolyma odpowiedź, trzeba będzie dodać eksport przed tymi liniami

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

. W zasadzie właśnie skomentowałem te linie - znalezione w ~/.bashrc na pulpicie Ubuntu 16.04 LTS. Nie wszystko działa. Ustaw także wartość PermitUserEnvironment na yes. – Ernie