Quiero poder ejecutar un comando desde mi máquina usando ssh y pasar a través de la variable de entorno $BUILD_NUMBER
Esto es lo que estoy intentando:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER se establece en la máquina que realiza la llamada ssh y, dado que la variable no existe en el host remoto, no se detecta.
¿Cómo paso el valor de $BUILD_NUMBER?

Respuestas:
Si utiliza
en vez de
su shell interpolará el
$BUILD_NUMBERantes de enviar la cadena de comando al host remoto.fuente
Las variables entre comillas simples no se evalúan. Utilice comillas dobles:
El shell expandirá las variables entre comillas dobles, pero no entre comillas simples. Esto cambiará a la cadena deseada antes de pasar al
sshcomando.fuente
(Esta respuesta puede parecer innecesariamente complicada, pero es fácilmente extensible y robusta con respecto a los espacios en blanco y los caracteres especiales, hasta donde yo sé).
Puede alimentar datos directamente a través de la entrada estándar del
sshcomando yreaddesde la ubicación remota.En el siguiente ejemplo,
sshuna línea terminada en nulo dando el nombre y valor de la variable.shhcomando en sí, recorremos estas líneas para inicializar las variables requeridas.Salida:
Si no los necesita
export, debería poder usarlos endeclarelugar deexport.Una versión realmente simplificada (si no necesita la extensibilidad, tiene una sola variable para procesar, etc.) se vería así:
fuente
La lista de variables de entorno aceptadas en SSHD de forma predeterminada incluye
LC_*. Así:fuente
Como se respondió anteriormente, no es necesario establecer la variable de entorno en el host remoto. En su lugar, puede simplemente hacer la meta-expansión en el host local y pasar el valor al host remoto.
Si realmente desea establecer la variable de entorno en el host remoto y usarla, puede usar el
envprogramaEn este caso, esto es un poco exagerado, y tenga en cuenta
env BUILD_NUMBER=$BUILD_NUMBER¿La meta expansión en el host local?BUILD_NUMBERvariable de entorno remoto será utilizada porel shell remoto
fuente
También es posible pasar variables de entorno explícitamente a través de ssh. Requiere alguna configuración del lado del servidor, por lo que esta no es una respuesta universal.
En mi caso, quería pasar una clave de cifrado del repositorio de respaldo a un comando en el servidor de almacenamiento de respaldo sin tener esa clave almacenada allí, ¡pero tenga en cuenta que cualquier variable de entorno está visible en
ps! La solución de pasar la clave en stdin también funcionaría, pero la encontré demasiado engorrosa. En cualquier caso, aquí se explica cómo pasar una variable de entorno a través de ssh:En el servidor, edite el
sshd_configarchivo, por lo general,/etc/ssh/sshd_configy agregue unaAcceptEnvdirectiva que coincida con las variables que desea pasar. Verman sshd_config. En mi caso, quiero pasar variables a borg backup, así que elegí:Ahora, en el cliente, use la
-o SendEnvopción para enviar variables de entorno. La siguiente línea de comando establece la variable de entornoBORG_SECRETy luego la marca para que se envíe a la máquina cliente (llamadabackup). Luego se ejecutaprintenvallí y filtra la salida para las variables BORG:fuente
LC_*variables permitidas para enviar, así que solo use$LC_TvE_foo, o$LC_BORG_SECRET, solo asegúrese de no "colisionar" con una variable incorporada.Escape de la variable para acceder a las variables fuera de la sesión ssh: ssh [email protected] "~ / tools / myScript.pl \ $ BUILD_NUMBER"
fuente
'$FOO'es equivalente a"\$FOO". la pregunta era "¿cómo pasar una variable de shell con SSH?". Como ya lo indicó @PatrickTrentin, esta no es una respuesta correcta porqueBUILD_NUMBERla variable de entorno no se configura de forma remota.