Uzak rsync işlemi için ortam değişkenlerini nasıl ayarlayabilirim?


12

Dosyaları bir bilgisayardan diğerine kopyalamak için rsync kullandığımda, her iki uçta da rsync işlemi başlatılır. Ancak, uzak uçta, kabuk başlatma dosyaları görünüşte okunmuyor, bu nedenle uzak rsync işlemi için ortam değişkenleri ayarlayamıyorum. Ne yazık ki, üzerinde çalışmak için rsync bir ortam değişkeni gerektiren rsync gereken bir sunucu var. Sunucuda yönetici değilim, bu yüzden genel yapılandırmayı değiştiremiyorum. Uzak rsync işlemi için ortam değişkenlerini ayarlamak için ne yapabilirim?


Sunucuda rsync işlemini nasıl başlatırsınız? Bir komut dosyasını ssh ile tetikleyebilir misiniz?
kraftan

Bunu yaptığınızda rsync localfilename remotehost:remotefilename, sunucuda bir rsync işlemi başlar. Tam olarak nasıl olduğundan emin değilim, ancak herhangi bir kabuk başlatma dosyasını okumuyor.
Ryan C. Thompson

Yanıtlar:


20

~/.profilessh somecommandetkileşimli bir ssh oturumunun (veya etkileşimli bir oturum başlattığınız başka bir oturum açma yönteminin) aksine, çalıştırdığınızda genellikle okunmaz .

Ssh, ortam değişkenlerini göndermeyi destekler. OpenSSH'de, içindeki SendEnvyönergeyi kullanın ~/.ssh/config. Ancak, belirli ortam değişkeninin sunucu yapılandırmasında bir AcceptEnvyönerge ile etkinleştirilmesi gerekir , bu nedenle bu sizin için işe yaramayabilir.

OpenSSH ayrıca sunucu tarafında ortam değişkenlerinin ayarlanmasına izin verir. Yine, buradaki PermitUserEnvironmentyönergeyle birlikte sunucu yapılandırmasında etkinleştirilmelidir . Değişkenler dosyada ayarlanabilir ~/.ssh/environment. Ortak anahtar kimlik doğrulamasını kullandığınızı varsayarsak, anahtar başına değişkenleri de ayarlayabilirsiniz ~/.ssh/authorized_keys: environment="FOO=bar"ilgili satırın başına ekleyin .

Hep düşünüyorum bir şey etmektir zamandır genel anahtar kimlik doğrulaması kullanıyorsanız kadar (işin garibi) çalışır (ab) kullanmak command=seçeneği de authorized_keysdosyaya. Seçeneğe sahip bir anahtar commandyalnızca belirtilen komutu çalıştırmak için iyidir; ancak authorized_keysdosyadaki komut , ortam değişkeni SSH_ORIGINAL_COMMANDkullanıcının belirttiği komuta ayarlanmış olarak çalışır (etkileşimli oturumlar için boştur). Böylece böyle bir şey kullanabilirsiniz ~/.ssh/authorized_keys(elbette, kimlik doğrulamak için bu anahtarı kullanmazsanız geçerli olmaz):

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

Okunaklılık için satır sonlarını koyduğumu, ancak bunun aslında bir satırda olması gerektiğini unutmayın.

Başka bir olasılık, ~/bin/rsync-wrappersunucuya bir sarıcı komut dosyası yazmaktır.

#!/bin/sh
. ~/.profile
exec rsync "$@"

Sonra geçmesi --rsync-path='bin/rsync-wrapper'üzerine rsynckomut satırında. To argümanı --rsync-pathbir kabuk tarafından genişletilir, bu yüzden isterseniz rsync komut satırını benzer bir şey ileterek kendi içinde tutabilirsiniz --rsync-path='. ~/.profile; rsync'.

Giriş kabuğunuzun bash veya zsh olmasına bağlı başka bir cadde var. Bash ~/.bashrc, etkileşimli olmasa bile rshd veya sshd tarafından çağrıldığında her zaman okur (ancak olarak adlandırılmasa bile sh). Zsh daima okur ~/.zshenv.

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

Bu hemen hemen özetliyor. Bir sarmalayıcı komut dosyası kullanmaktan daha iyi bir yol olduğunu umuyordum.
Ryan

Ama bir dakika. Kabuk başlangıç ​​dosyalarım okunmuyorsa, sunucuda rsync ikili dosyasını nasıl bulabilir? $PATHKabuğum init betiklerimde eklemem gereken standart olmayan bir konum olan ~ / usr içine kurdum .
Ryan

@Ryan: Aslında en doğrudan yöntemi unuttum (düzenlememe bakın), ancak sunucu yapılandırmasında da bir yönerge etkinleştirilmesini gerektirir. PATHHesabınızı dikkate almanın bir yolunu bulduysanız , orada başka bir değişken ayarlayabilmeniz gerekir. (Bu işe yaramazsa, set -xherhangi bir kabuk komut dosyasından başlayarak olabildiğince çok iz eklemeye çalışın ; rsyncikiliyi, ortamı bir dosyaya döken ve ardından gerçek ikiliyi çağıran bir sarmalayıcı komut dosyası ile değiştirin .)
Gilles 'SO -

Ne olmuş ~/.ssh/rc?
Ryan

@Ryan: ~/.ssh/rcayrı bir kabuk işlemi tarafından yürütülür. En iyi bahsinizin bir sarıcı komut dosyası olduğunu düşünüyorum --rsync-path='. ~/.profile; rsync'. Veya rsyncdiğer sorunuza göre uygun bir rpath ile yeniden derleme .
Gilles 'SO- kötü olmayı durdurun'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.