SCPがMy Fedoraサーバーに接続しても、ユーザーはファイルタイムスタンプを修正できないというエラーが表示されます(「時間設定:操作は許可されていません」)。このユーザーはファイルを所有していませんが、chown
セキュリティ上の理由からこのユーザーにファイルを送信することはできません。ユーザーは行うことができますが、sudo
これはSCP / FTPクライアントを介して発生するため、そうする方法はありません。最後に、タイムスタンプ設定を必要とする同期(rsyncやWinSCPなど)を使用するためにこのユーザーにrootアクセスを許可したくありません。
rw
このユーザーは、すべての関連ファイルとディレクトリに対するフルアクセス権を持つグループの一部です。これらの特定のファイルに対する権限をユーザーにtouch -t
付与せずにそのファイルに対する権限を付与する方法についてのchown
アイデアはありますか?
追加情報これは、単一の開発者シナリオ(たとえばSCMなし)でPHP開発を可能にすることです。私は、ユーザーが開発サーバーで変更を「すぐに」プレビューできるようにしながら、EclipseまたはNetBeansを使用してPHPベース(WordPress)サイトのローカルコピーで作業しようとしています。ユーザーはリモートで作業します。これまで、すべての自動同期試行は失敗しました。 「監視フォルダ」モードでWinSCPを使用している場合でも常に日付/時刻スタンプを設定しようとするため、ローカルフォルダを監視し、エラーのあるリモートディレクトリに変更をアップロードしようとします。 。
このユーザーはsudoアクセス権を持っていますが、「root」で作業するのは本当に良い考えではないと言われました。そのため、操作を実行するために root としてログインするのが嫌いです。さらに、これは必要ではありません。私はスーパーユーザー以外の人も同じことができることを願っています。つまり、自分のアカウント情報を使用し、FTP接続を確立し、同期を介してリモートで作業できることを願っています。したがって、ソリューションはrootアクセス権を持っていない人にも機能するはずです。
私を驚かせたのは、私がどれだけの困難を経験したかでした。これらのソフトウェア(NetBeans、Eclipse、WinSCP)はすべて同期を可能にするように設計されており、すべてタイムスタンプ書き込みを試みます。だからこれが可能でなければなりません。 WinSCPには「タイムスタンプ設定」をオフにするオプションがありますが、監視/同期フォルダを選択するとこのオプションは無効になります(常に「オン」)。だからそうです得るかなり標準的なものになりました。
私がLinuxに関しては完全に愚かで、開発「サーバー管理者」であることを考えると、私がやっていることが愚かであるか、設定が間違っていると仮定できます。
一般化するつまり、ディレクトリへのグループr / wアクセス権を持つすべてのユーザーが、SCPを介してそのディレクトリ内のファイルのタイムスタンプを変更できることを願っています。
答え1
なぜ動作しないのか
次のようにファイルの変更時間を変更しようとするとtouch
あるいは、より一般的には低レベルのシステムコールを使用します。utime
、2つの状況があります。
- ファイル変更時間を特定の時間に設定しようとしています。これを行うには、ファイルの所有者である必要があります。 (技術的には、プロセスの有効なユーザーIDはファイルの所有者である必要があります。²)
- ファイルの変更時刻を現在時刻に設定しようとしています。これは、ファイルに書き込む権限がある場合にのみ機能します。この例外が発生するのは、ファイル内の既存のバイトを同じ値で上書きすると同じ効果が得られるためです。
なぜ一般的に重要ではないのですか?
- ftp、scp、rsyncなどを使用してファイルをコピーすると、コピーした人が所有する新しいファイルが作成されます。したがって、コピー機は文書の時間を設定する権限を持っています。
- rsyncを使用すると、既存のディレクトリに時間を設定できません。そのディレクトリでは、ファイルが最後に同期された時刻に設定されます。ほとんどの場合、これは問題ではありません。 ()を渡して、
--omit-dir-times
rsyncにディレクトリ時間を無視するように指示できます-O
。 - バージョン管理システムでは、改訂日がファイル内に保存され、ファイルのメタデータはほとんど関連性がありません。
解決策
これは、単一の開発者シナリオ(たとえばSCMなし)でPHP開発を可能にすることです。
さて、そこで止まります。開発者が一人であってもSCMを使用してはならないわけではありません。 SCMを使用する必要があります。デベロッパーにファイルをチェックインし、[デプロイ]ボタンをクリックしてSCMからライブディレクトリにファイルをチェックアウトする方法を提供します。
SCMを使用してはならない技術的な理由はまったくありませんが、人間的な理由はあります。これらのファイルを扱う人が自分を「開発者」と呼ぶ場合は、SCMを使用する必要があります。ただし、技術的な知識がない人が文書を作成している場合、SCMは複雑すぎる可能性があります。したがって、FTPまたはSSH経由でファイルをプッシュしてください。これは3つの方法で達成できます。
- 本当に時間を同期する必要がありますか?上記のように、
rsync
時間を同期しないオプションがあります。 SCPはあなたが指示しない限りこれを行いません。 WinSCPについてはわかりませんが、機能することもできます。 - 今やっていることを続けて、時間に関するメッセージを無視してください。ファイルはまだコピーされています。エラーを無視することは常に危険なので、これは良いオプションではありません。しかし、技術的には可能です。
- ユーザー所有ファイルを埋めるための柔軟性が必要な場合、
apache
一般的なアプローチはSSHを介したユーザーアクセスを許可することですapache
。シンプルこの方法は、ユーザーがSSH秘密鍵を生成し、その公開鍵をに追加することです。これは、ユーザーがユーザーとして任意のコマンドを実行~apache/.ssh/authorized_keys
できることを意味します。apache
とにかくユーザーにsudo権限を与えることができるので、これはあなたの場合には重要ではありません。より多くの制限を設定できますが、それほど簡単ではありません(別の名前、同じユーザーID、制限されたシェル、およびchroot刑務所を持つ別々のユーザーデータベースエントリが必要です。詳細については別の質問にありますが、すでにそうです)。このウェブサイトで扱うサーバー障害)。
¹または空のファイルの場合は、1バイトを書いてから切り捨てます。
²他の合併症がない限り、私が知る限り、ここには適用されません。
答え2
次のように、リモート側でsudoを使用するようにrsyncを設定できます。
rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/