
我正在透過 SFTP 自動進行檔案傳輸,但在更改遠端主機中的檔案所有權時遇到了困難。問題是 SFTPchown
和chgrp
指令只接受數字 uids/gids,而這些數字是事先未知的。我的自動化的預期場景是使用者通知文件目的地以及字串使用者名稱和群組名稱。
有沒有辦法透過 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
is-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 …
終止master連線。
我的其他可能有用的答案:
- 使用腳本回答,該腳本安全地為控制套接字建立臨時目錄。
- 如何使用
sshfs
共享控制套接字。答案包括一個關於佔位符的有趣註釋。 - 關於
sshfs
一般情況。