Как получить строковое имя пользователя/группы из числового uid/gid на удаленном хосте в сеансе SFTP?

Как получить строковое имя пользователя/группы из числового uid/gid на удаленном хосте в сеансе SFTP?

Я автоматизирую передачу файлов через 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.-Sman 1 ssh). Этот подход требует от вас аутентификации.один раз. sftpиз OpenSSH поддерживает -oи может совместно использовать соединение с ssh.

Процедура:

  1. ssh -Nf -o ControlMaster=yes -o ControlPath=… user@server. Главное соединение. Здесь вы проходите аутентификацию, прежде чем соединение перейдет в фоновый режим.

  2. ssh -o ControlPath=… …и/или sftp -o ControlPath=… …и/или даже sshfs(см. ниже). Пока вы придерживаетесь выбранного управляющего сокета ( ControlPath) и главное соединение работает, эти команды будут его использовать. Получайте удовольствие.

    Например, вы можете запустить его uid="$(ssh … "id -u someuser")"и использовать $uidпозже в своем скрипте.

  3. Наконец, ssh -o ControlPath=… -O exit …для завершения основного соединения.

Другие мои ответы, которые могут быть полезны:

Связанный контент