我正在通过 SFTP 自动传输文件,但在远程主机中更改文件所有权时卡住了。问题是 SFTPchown
和chgrp
命令只接受数字 uid/gid,而这些 uid/gid 是事先不知道的。我的自动化预期场景是让用户告知文件目的地以及字符串用户名和组名。
有没有办法通过 SFTP 会话从远程主机中的字符串用户/组名中查询数字 uid/gid?
一个简单的解决方法是打开一个额外的 SSH 会话并使用常规 shellchown
和chgrp
命令。但我所在的公司使用定时令牌进行身份验证,简而言之,额外的会话意味着每个主机需要额外的 30 秒,这对于批量安装来说是行不通的。
更难的方法是找到ls -l
目录(可能是文件)中具有所需凭据的目录,然后ls -n
获取数字版本。但这存在花费时间太长、找不到合适的目录/文件甚至卡住的风险,如果目录中的文件太多而无法ls
工作......
答案1
这是不可能的。
至少与广泛使用的 SFTP 版本 3 不兼容。
答案2
一个简单的解决方法是打开一个额外的 SSH 会话并使用常规 shell
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
一般。