web-dev-qa-db-ja.com

ユーザーは-tをタッチできません

FedoraサーバーにSCPを実行すると、ユーザーはファイルのタイムスタンプを変更できないことに関するエラーを繰り返し発生します(「設定時刻:操作は許可されていません」)。ユーザーはファイルの所有者ではありませんが、セキュリティ上の理由から、このユーザーにファイルをchownすることはできません。ユーザーはSudoできますが、これはSCP/FTPクライアントを介して行われているため、これを行う方法もありません。そして最後に、このユーザーにrootアクセス権を与える必要はなく、タイムスタンプを設定する必要があるrsyncやWinSCPなどの同期を使用できるようにします。

ユーザーは、関連するすべてのファイルとディレクトリに対する完全なrw権限を持つグループの一部です。これらの特定のファイルをchownすることなく、ユーザーにtouch -tへのアクセス許可を与える方法について何か考えはありますか?

詳細情報これはすべて、PHP単一開発者シナリオでの開発(つまり、SCMなし)での開発を有効にすることと関係しています。私はEclipseまたはNetBeansで作業しようとしていますPHPベース(WordPress)サイトのローカルコピーで作業しながら、ユーザーが開発サーバーで変更を「瞬時に」プレビューできるようにします。ユーザーはリモートで作業します。これまでのところ、自動同期のすべての試行は失敗しています- WinSCPを「監視フォルダ」モードで使用している場合でも、ローカルフォルダを監視し、常に日付/タイムスタンプを設定しようとするため、リモートディレクトリエラーまでの変更をアップロードしようとします。

ユーザーはSudoアクセス権を持っていますが、「root」の下で作業することは本当に良い考えではないと言われているので、この作業を行うためにrootとしてログインするだけでは不本意です。その上、それは必要ではないはずです。スーパーユーザー以外のユーザーが同じことをできるようにしたい-アカウント情報を使用してFTP接続を確立し、同期を介してリモートで作業できるようにしたい。したがって、ソリューションはルートアクセスのない人のために機能する必要があります。

私を驚かせるのは、私がどれほどの困難を抱えているかです。これらのソフトウェア(NetBeans、Eclipse、WinSCP)はすべて同期を可能にするように設計されており、すべてタイムスタンプを書き込もうとします。だからそれは可能でなければならない。 WinSCPには「タイムスタンプの設定」をオフにするオプションがありますが、モニター/同期フォルダーを選択すると、このオプションは利用できなくなります(常に「オン」)。したがって、かなり標準的なものになるのはgotです。

Linuxに関しては完全に馬鹿で、開発の「サーバー管理者」であることを考えると、それは私がやっていることや、私が(誤って)構成したことのような馬鹿げたものであるとしか想定できません。

概要簡単に言えば、ディレクトリへのグループr/wアクセス権を持つすべてのユーザーが、SCPを介してそのディレクトリ内のファイルのタイムスタンプを変更できるようにしたいと考えています。

10
Tom Auger

機能しない理由

touch を使用して、またはより一般的には基本的なシステムコール utime を使用してファイルの変更時刻を変更しようとすると、 2つのケース。

  • ファイルの変更時刻を特定の時刻に設定しようとしています。これには、あなたがファイルの所有者である必要があります。 (技術的には、プロセスの有効なユーザーIDはファイルの所有者である必要があります。²)
  • ファイルの変更時刻を現在の時刻に設定しようとしています。これは、ファイルへの書き込み権限がある場合にのみ機能します。この例外の理由は、ファイルの既存のバイトを同じ値で上書きすることで、とにかく同じ効果を達成できるためです¹。

通常これが問題にならない理由

  • Ftp、scp、rsyncなどでファイルをコピーすると、コピーは、コピーを実行した人が所有する新しいファイルを作成します。したがって、コピー機はファイルの時間を設定する権限を持っています。
  • Rsyncでは、既存のディレクトリの時刻を設定することはできません。それらは、ファイルが最後に同期された時刻に設定されます。ほとんどの場合、これは問題ではありません。 --omit-dir-times-O)を渡すことで、rsyncにディレクトリ時間を気にしないように指示できます。
  • バージョン管理システムでは、改訂日はファイル内に保存されます。ファイルのメタデータはほとんど関係ありません。

ソリューション

これはすべて、PHP開発を単一の開発者シナリオで(つまり、SCMなしで)有効にすることと関係しています。

はい、そこで停止します。開発者が1人だけだからといって、SCMを使用するべきではないという意味ではありません。 SCMを使用する必要があります。開発者にファイルをチェックインしてもらい、「デプロイ」ボタンを押してSCMからライブディレクトリにファイルをチェックアウトする方法を開発者に提供します。

SCMを使用すべきでない技術的な理由はまったくありませんが、人間的な理由がある可能性があります。これらのファイルに取り組んでいる人が自分自身を「開発者」と表現している場合は、SCMを使用する必要があります。しかし、これが技術者ではない人がドキュメントをプッシュする場合、SCMは複雑すぎる可能性があります。 FTPまたはSSH経由でファイルをプッシュしてください。これが機能する方法は3つあります。

  • 本当に時間を同期する必要がありますか?上に示したように、rsyncには時間を同期しないオプションがあります。 Scpはあなたがそれを言わない限りそうしません。私はWinSCPを知りませんが、おそらくそれも可能です。
  • あなたがしていることを続けてください、時間についてのメッセージを無視してください。ファイルはまだコピー中です。エラーを無視することは常に危険であるため、これは良いオプションではありません。しかし、それは技術的には可能です。
  • Apacheユーザーが所有するファイルに入力する際に​​柔軟性が必要な場合、通常のアプローチは、ユーザーにApacheとしてのSSHアクセスを許可することです。 easyアプローチは、ユーザーにSSH秘密鍵を作成させ、対応する公開鍵を~Apache/.ssh/authorized_keysに追加させることです。これは、ユーザーがApacheユーザーとして任意のコマンドを実行できることを意味します。とにかくユーザーにSudo権限を与えても大丈夫なので、あなたの場合は問題ではありません。より多くの制限を課すことは可能ですが、それほど簡単ではありません(異なる名前、同じユーザーID、制限されたシェル、およびchroot jailを持つ別個のユーザーデータベースエントリが必要です。詳細は別の質問にありますが、これはすでに説明されている可能性がありますこのサイトまたは Server Fault )。

¹ または、空のファイルの場合は、バイトを書き込んでから切り捨てます。
² 追加の合併症を除いて、私が知っているものはここでは適用されません。

次のように、リモートエンドでSudoを使用するようにrsyncを設定できます。

rsync -ave ssh --rsync-path="Sudo rsync" /source/ user@Host:/dest/
2
Caleb