
SFTP 経由でファイル転送を自動化していますが、リモート ホストでファイルの所有権を変更するときに行き詰まってしまいました。問題は、SFTPchown
とchgrp
コマンドが数値の uid/gid のみを受け入れることであり、これらは事前にはわかりません。自動化の想定シナリオは、ユーザーがファイルの宛先と文字列のユーザー名とグループ名を通知することです。
SFTP セッションを介してリモート ホストの文字列 user/groupname から数値 uid/gid を照会する方法はありますか?
簡単な回避策としては、追加の 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
全般について。