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


10

FedoraサーバーにSCPを実行すると、ファイルのタイムスタンプを変更できないというエラー( "set time:operation not allowed")が発生し続けます。ユーザーはファイルの所有者ではありませんが、chownセキュリティ上の理由からこのユーザーにファイルを送信することはできません。ユーザーはできますがsudo、これはSCP / FTPクライアントを介して行われるため、それを行う方法もありません。最後に、このユーザーにrootアクセスを与える必要はなく、タイムスタンプを設定する必要があるrsyncやWinSCPなどの同期を使用できるようにします。

ユーザーは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
あなたのファイルシステムは面白いものでマウントされていますか?ACLを使用していますか?通常、これはグループメンバーシップで可能です。
Caleb

5
基本的に、システムは「-t [his]には触れられない」と言っています。
boehj

@Caleb:いいえ、所有者でない限り、現在の日付にのみ設定できます。@トム:日付を尊重することは重要ですか?要件を少し詳しく説明していただけますか。ユーザーがファイルに書き込める場合、ユーザーがファイルを所有することが重要なのはなぜですか。通常、これらの状況では、ファイルに最後に書き込んだ人がそれを所有します。
Gilles「SO-邪悪なことをやめよう」

@トム:「このユーザーにrootアクセスを許可する必要はない」と「ユーザーはsudoを実行できる」の間には明らかな矛盾があります。この部分をよりよく説明できますか?rootグループの使用に関して:rootグループには特別な権限はなく、rootユーザーだけが持っています。
Gilles「SO-邪悪なことをやめよう」

回答:


10

機能しない理由

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

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

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

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

ソリューション

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

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

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

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

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


興味深い説明をしてくれたGillesに感謝します。しかし、ユースケースについてどれほど明確にできるかわかりません。NetBeansは、同期するたびに「接続を切断できません」エラーをスローし続けます(ただし、ファイルはサーバー上で正しく転送され、検証されます)。WinSCPは「設定時刻:操作は許可されていません」エラーをスローします。ファイルを解凍すると、タイムスタンプを将来の時刻に設定できないという警告が表示されます。それを超えて、問題がどこにあるのかわかりません。ローカルをリモートディレクトリに同期できるようにしたいだけです。SCP / FTP経由で、問題はタイムスタンプのようです。これは役に立ちますか?おそらく違います。
トムオーガー

@トム:なぜユーザーにファイルを所有させることができないのか、私にはまだわかりません。
Gilles「SO-邪悪なことをやめよ」

一部のファイルはApacheが所有する必要があるため(たとえば、uploadsディレクトリ)、誰かがディレクトリ内の一部のファイルで作業しているという理由だけで所有者を変更することはできません。FTPを使用してファイルを上書きしても、所有者が変更されるとは限りません。私はこの行動を変える必要があるとは思いません。
トム・オージェ

@Tom:これらは既存のファイルであるという理由だけで所有者は変更されません。ユーザーにファイルのアップロードを許可しない理由を理解できません。ユーザーはapache時刻を設定できます。正しい解決策と次善の解決策については、私の改訂版の回答を参照してください。
Gilles「SO-邪悪なことをやめなさい」

この質問を続けてくれてありがとうGilles。SVNまたは一部のバリアントの使用は、開発の観点からは最適ではありません。リモートでWeb開発を行った人なら誰でも、そのプロセスは通常、特にインクリメンタルであることを(特に視覚的にスタイリングしている場合は)わかるため、約30〜60秒ごとにコミットを実行しています。常にIDEを終了し、コミットを実行してから、ブラウザーをプレビューする必要がある場合は、単純なプロセスであるはずのものに膨大なオーバーヘッドを追加しています。SVNは、複数の開発者がサイトの同じ部分で作業している場合にのみ意味があります。プログラミングとは異なります。
トム・オージェ

2

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

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/

sudoルールは何でしょうか?rsyncを許可するだけで、ユーザーは任意のファイルを上書きできます。引数の制限を正しく設定するのはかなり難しく、いずれにしても、rsyncの入力を制限する必要があると思います。これは、ラッパースクリプトで技術的には可能ですが、簡単ではありません。
Gilles「SO-邪悪なことをやめよう」

あなたが正しい、許可するsudo rsyncことを制限することは非常に困難です。OPはユーザーがすでにsudoアクセスを持っていると言ったので、私はそれを提案しただけです。
カレブ

ありがとう-これは興味深いですが、開発者はWindowsボックスを使用しているので、rsyncが最善の方法だとは思いません。繰り返しになりますが、私の投稿の編集で述べたように、このソリューションは、特定のディレクトリを所有するグループに属しているユーザーを超えて、一部の特権ユーザーではなく、平均的なユーザーに機能します。
トムオーガー

次に検討する必要があるのはACL(アクセス制御リスト)の設定だと思いますが、私はこの分野での経験がほとんどないので、おそらくいくつかのグルが答えを追加し、これを行う方法と方法を説明できます。
カレブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.