
Estoy automatizando la transferencia de archivos a través de SFTP y me quedé atascado al cambiar la propiedad del archivo en el host remoto. El problema es que los comandos SFTP chown
y chgrp
solo aceptan uids/gids numéricos, que no se conocen de antemano. El escenario esperado para mi automatización es que el usuario informe los destinos de los archivos y encadene nombres de usuarios y nombres de grupos.
¿Hay alguna manera de consultar el uid/gid numérico de la cadena de nombre de usuario/grupo en el host remoto a través de la sesión SFTP?
Una solución sencilla sería abrir una sesión SSH adicional y utilizar comandos chown
y shells normales chgrp
. Pero la empresa en la que trabajo utiliza tokens cronometrados para la autenticación y, en resumen, una sesión adicional significa 30 segundos adicionales por host, algo imposible para instalaciones por lotes.
Una opción más difícil sería buscar ls -l
directorios, tal vez archivos, para encontrar uno con las credenciales necesarias y luego ls -n
obtener la versión numérica. Pero esto tiene el riesgo de tomar demasiado tiempo, no encontrar directorios/archivos adecuados o incluso quedarse atascado si un directorio tiene demasiados archivos para ls
funcionar...
Respuesta1
No es posible.
Al menos no con la versión 3 de SFTP, ampliamente utilizada.
Respuesta2
Una solución sencilla sería abrir una sesión SSH adicional y utilizar comandos
chown
y shells normaleschgrp
. Pero la empresa en la que trabajo utiliza tokens cronometrados para la autenticación y, en resumen, una sesión adicional significa 30 segundos adicionales por host, algo imposible para instalaciones por lotes.
Con -o ControlMaster=
y -o ControlPath=
puedes compartir varias sesiones a través de una única conexión de red (ver man 5 ssh_config
). Opciones cortas para ssh
son -M
y -S
respectivamente (verman 1 ssh
). Este enfoque requiere que usted se autentiqueuna vez. sftp
de OpenSSH admite -o
y puede compartir una conexión con ssh
.
El procedimiento:
ssh -Nf -o ControlMaster=yes -o ControlPath=… user@server
. La conexión maestra. Aquí usted se autentica antes de que la conexión pase a segundo plano.ssh -o ControlPath=… …
y/osftp -o ControlPath=… …
y/o inclusosshfs
(ver más abajo). Siempre que se ciña al enchufe de control elegido (ControlPath
) y la conexión maestra funcione, estos comandos la utilizarán. Divertirse.Por ejemplo, puede ejecutarlo
uid="$(ssh … "id -u someuser")"
y utilizarlo$uid
más adelante en su script.Finalmente
ssh -o ControlPath=… -O exit …
para terminar la conexión maestra.
Mis otras respuestas que pueden ser útiles:
- Responda con un script que crea un directorio temporal para el socket de control de forma segura.
- Cómo utilizar
sshfs
con enchufe de control compartido. La respuesta incluye una nota interesante sobre los marcadores de posición. - sobre
sshfs
en general.