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_NUMBER
antes 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
ssh
comando.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
ssh
comando yread
desde la ubicación remota.En el siguiente ejemplo,
ssh
una línea terminada en nulo dando el nombre y valor de la variable.shh
comando en sí, recorremos estas líneas para inicializar las variables requeridas.Salida:
Si no los necesita
export
, debería poder usarlos endeclare
lugar 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
env
programaEn 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_NUMBER
variable 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_config
archivo, por lo general,/etc/ssh/sshd_config
y agregue unaAcceptEnv
directiva 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 SendEnv
opción para enviar variables de entorno. La siguiente línea de comando establece la variable de entornoBORG_SECRET
y luego la marca para que se envíe a la máquina cliente (llamadabackup
). Luego se ejecutaprintenv
allí 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_NUMBER
la variable de entorno no se configura de forma remota.