Kiedy używam rsync do kopiowania plików z jednego komputera na inny, proces rsync jest uruchamiany na obu końcach. Jednak na zdalnym końcu pliki inicjalizacji powłoki najwyraźniej nie są odczytywane, więc nie mogę skonfigurować zmiennych środowiskowych dla zdalnego procesu rsync. Niestety jest jeden serwer, który muszę rsync, na którym rsync wymaga zmiennej środowiskowej do działania. Nie jestem administratorem na serwerze, więc nie mogę zmienić konfiguracji globalnej. Co mogę zrobić, aby ustawić zmienne środowiskowe dla zdalnego procesu rsync?
ssh
rsync
environment-variables
remote-connection
Ryan C. Thompson
źródło
źródło
rsync localfilename remotehost:remotefilename
, proces rsync zostanie uruchomiony na serwerze. Nie jestem pewien, jak to zrobić, ale nie odczytuje żadnych plików inicjujących powłoki.Odpowiedzi:
~/.profile
zazwyczaj nie jest odczytywany podczas uruchamianiassh somecommand
, w przeciwieństwie do interaktywnej sesji ssh (lub innej metody logowania, w której rozpoczyna się sesję interaktywną).Ssh obsługuje wysyłanie zmiennych środowiskowych. W OpenSSH użyj
SendEnv
dyrektywy w~/.ssh/config
. Jednak konkretna zmienna środowiskowa musi być włączona zAcceptEnv
dyrektywą w konfiguracji serwera , więc może to nie zadziałać.OpenSSH umożliwia także ustawianie zmiennych środowiskowych po stronie serwera. Ponownie należy to włączyć w konfiguracji serwera, tutaj z
PermitUserEnvironment
dyrektywą. Zmienne można ustawić w pliku~/.ssh/environment
. Zakładając, że korzystasz z uwierzytelniania za pomocą klucza publicznego, możesz również ustawić zmienne dla poszczególnych kluczy w~/.ssh/authorized_keys
: dodajenvironment="FOO=bar"
na początku odpowiedniego wiersza.Jedną rzeczą, która moim zdaniem zawsze działa (co dziwne), o ile korzystasz z uwierzytelniania za pomocą klucza publicznego, to (ab) użycie
command=
opcji zauthorized_keys
pliku. Klawisz zcommand
opcją nadaje się tylko do uruchomienia określonej komendy; ale polecenie wauthorized_keys
pliku działa ze zmienną środowiskowąSSH_ORIGINAL_COMMAND
ustawioną na polecenie określone przez użytkownika (puste dla sesji interaktywnych). Możesz więc użyć czegoś takiego w~/.ssh/authorized_keys
(oczywiście nie będzie to miało zastosowania, jeśli nie użyjesz tego klucza do uwierzytelnienia):Zauważ, że wstawiłem powyżej podziału linii dla czytelności, ale tak naprawdę musi to być wszystko w jednym wierszu.
Inną możliwością jest napisanie skryptu opakowania
~/bin/rsync-wrapper
na serwerze, coś w rodzajuNastępnie przejść
--rsync-path='bin/rsync-wrapper'
narsync
linii poleceń. Argument do--rsync-path
jest rozszerzany przez powłokę, więc jeśli wolisz, możesz ustawić linię poleceń rsync na własną rękę, przekazując coś podobnego--rsync-path='. ~/.profile; rsync'
.Istnieje inna droga, która zależy od tego, czy twoja powłoka logowania jest bash lub zsh. Bash zawsze czyta,
~/.bashrc
gdy jest wywoływany przez rshd lub sshd, nawet jeśli nie jest interaktywny (ale nie, jeśli jest wywoływany jakosh
). Zsh zawsze czyta~/.zshenv
.źródło
$PATH
skryptów inicjujących powłokę.PATH
pod uwagę, powinieneś być w stanie ustawić tam dowolną inną zmienną. (Jeśli to nie zadziała, spróbuj dodać tyle śladów, ile możesz, zaczynając odset -x
dowolnego skryptu powłoki; zamieńrsync
plik binarny na skrypt, który zrzuca środowisko do pliku, a następnie wywołuje prawdziwy plik binarny.)~/.ssh/rc
?~/.ssh/rc
jest wykonywany przez osobny proces powłoki. Myślę, że najlepszym rozwiązaniem jest skrypt otoki lub--rsync-path='. ~/.profile; rsync'
. Lub rekompilacjarsync
z odpowiednią ścieżką rpath zgodnie z drugim pytaniem.