
Я автоматизирую передачу файлов через SFTP и застрял при смене владельца файла на удаленном хосте. Проблема в том, что SFTP chown
и chgrp
команды принимают только числовые uid/gid, которые заранее неизвестны. Ожидаемый сценарий для моей автоматизации заключается в том, что пользователь должен сообщить адресатам файлов и строковым именам пользователей и именам групп.
Есть ли способ запросить числовой uid/gid из строки user/groupname на удаленном хосте через сеанс SFTP?
Простым решением было бы открыть дополнительный сеанс SSH и использовать обычные оболочки chown
и chgrp
команды. Но компания, в которой я работаю, использует временные токены для аутентификации, и, короче говоря, дополнительный сеанс означает дополнительные 30 секунд на хост, что не подходит для пакетной установки.
Более сложным решением было бы найти ls -l
каталоги, может быть файлы, с нужными учетными данными, а затем ls -n
получить числовую версию. Но это сопряжено с риском слишком долгого выполнения, отсутствия подходящих каталогов/файлов или даже зависания, если в каталоге слишком много файлов для ls
работы...
решение1
Это невозможно.
По крайней мере, с широко используемой версией SFTP 3.
решение2
Простым решением было бы открыть дополнительный сеанс SSH и использовать обычные оболочки
chown
иchgrp
команды. Но компания, в которой я работаю, использует временные токены для аутентификации, и, короче говоря, дополнительный сеанс означает дополнительные 30 секунд на хост, что не подходит для пакетных установок.
С помощью -o ControlMaster=
и -o ControlPath=
вы можете совместно использовать несколько сеансов через одно сетевое соединение (см. man 5 ssh_config
). Короткие варианты для ssh
и соответственно (см -M
.-S
man 1 ssh
). Этот подход требует от вас аутентификации.один раз. sftp
из OpenSSH поддерживает -o
и может совместно использовать соединение с ssh
.
Процедура:
ssh -Nf -o ControlMaster=yes -o ControlPath=… user@server
. Главное соединение. Здесь вы проходите аутентификацию, прежде чем соединение перейдет в фоновый режим.ssh -o ControlPath=… …
и/илиsftp -o ControlPath=… …
и/или дажеsshfs
(см. ниже). Пока вы придерживаетесь выбранного управляющего сокета (ControlPath
) и главное соединение работает, эти команды будут его использовать. Получайте удовольствие.Например, вы можете запустить его
uid="$(ssh … "id -u someuser")"
и использовать$uid
позже в своем скрипте.Наконец,
ssh -o ControlPath=… -O exit …
для завершения основного соединения.
Другие мои ответы, которые могут быть полезны:
- Ответьте скриптом, который безопасно создаст временный каталог для управляющего сокета..
- Как использовать
sshfs
с общим сокетом управления. В ответе есть интересное примечание о заполнителях. - О
sshfs
в целом.