Cuando uso rsync para copiar archivos de una computadora a otra, se inicia un proceso rsync en ambos extremos. Sin embargo, en el extremo remoto, los archivos de inicialización de shell aparentemente no se leen, por lo que no puedo configurar variables de entorno para el proceso rsync remoto. Desafortunadamente, hay un servidor al que necesito rsync en el que rsync requiere una variable de entorno para funcionar. No soy administrador del servidor, por lo que no puedo cambiar la configuración global. ¿Qué puedo hacer para configurar las variables de entorno para un proceso rsync remoto?
ssh
rsync
environment-variables
remote-connection
Ryan C. Thompson
fuente
fuente
rsync localfilename remotehost:remotefilename
, se iniciará un proceso rsync en el servidor. No estoy exactamente seguro de cómo, pero no lee ningún archivo de inicialización de shell.Respuestas:
~/.profile
por lo general, no se lee cuando ejecutassh somecommand
, a diferencia de una sesión ssh interactiva (u otro método de inicio de sesión donde inicia una sesión interactiva).Ssh admite el envío de variables de entorno. En OpenSSH, use la
SendEnv
directiva en~/.ssh/config
. Sin embargo, la variable de entorno específica debe habilitarse con unaAcceptEnv
directiva en la configuración del servidor , por lo que es posible que esto no funcione para usted.OpenSSH también permite configurar variables de entorno en el lado del servidor. Nuevamente, esto debe habilitarse en la configuración del servidor, aquí con la
PermitUserEnvironment
directiva. Las variables se pueden establecer en el archivo~/.ssh/environment
. Suponiendo que use la autenticación de clave pública, también puede establecer variables por clave en~/.ssh/authorized_keys
: agregarenvironment="FOO=bar"
al comienzo de la línea correspondiente.Una cosa que creo que siempre funciona (por extraño que parezca) siempre y cuando esté utilizando la autenticación de clave pública es (ab) usar la
command=
opción en elauthorized_keys
archivo. Una clave con unacommand
opción es buena solo para ejecutar el comando especificado; pero el comando en elauthorized_keys
archivo se ejecuta con la variable de entornoSSH_ORIGINAL_COMMAND
establecida en el comando que especificó el usuario (vacío para sesiones interactivas). Por lo tanto, puede usar algo como esto~/.ssh/authorized_keys
(por supuesto, no se aplicará si no usa esta clave para autenticar):Tenga en cuenta que puse saltos de línea arriba para la legibilidad, pero en realidad esto debe estar todo en una línea.
Otra posibilidad es escribir un script de envoltura
~/bin/rsync-wrapper
en el servidor, algo así comoLuego pase
--rsync-path='bin/rsync-wrapper'
larsync
línea de comando. El argumento para--rsync-path
se expande mediante un shell, por lo que si lo prefiere, puede hacer que la línea de comando rsync sea autónoma pasando algo como--rsync-path='. ~/.profile; rsync'
.Hay otra vía que depende de que su shell de inicio de sesión sea bash o zsh. Bash siempre lee
~/.bashrc
cuando es invocado por rshd o sshd, incluso si no es interactivo (pero no si se llama comosh
). Zsh siempre lee~/.zshenv
.fuente
$PATH
en mis scripts de inicio de shell.PATH
en cuenta, debería poder establecer cualquier otra variable allí. (Si esto no funciona, trate de añadir tantas huellas como sea posible, a partir deset -x
cualquier secuencia de comandos shell; reemplazar elrsync
binario por un guión envoltorio que vuelca el medio ambiente en un archivo binario a continuación, llama a la real.)~/.ssh/rc
?~/.ssh/rc
se ejecuta mediante un proceso de shell separado. Creo que su mejor apuesta es un script de envoltura o--rsync-path='. ~/.profile; rsync'
. O recompilersync
con un rpath adecuado según su otra pregunta.