web-dev-qa-db-ja.com

コンピューター間でファイルを転送すると、ファイルのユーザー所有権は変更されますか?

シナリオ:コンピューターA(userA)で作成されたファイルで、ファイルの所有権はuserAとして取得されます。ファイルのアクセス許可は、別のユーザー(userB)...でコンピューターBに転送されます。

Does the ownership of the original file change from the original user (userA) in computer A to the user (userB) of computer B?

How can I create a file that is only writable by me, the creator and owner, and only readable to anyone who might receive that file on other computers?

コンピューターA(userA)でファイルパーミッション755のtestfile.txtを作成し、コンピューターAからBにscpを使用して転送する前後のこのファイルのパーミッションと所有権を比較しました。 。現在コンピュータBにある元のファイルのユーザーIDがuserAではなくuserBであることに気付きました[ファイルの場所作成されました]。

'userA'を持つコンピューターA

rwx-r-x-r-- userA testfile.txt

'userB'を持つコンピューターB

rwx-r-x-r-- userB testfile.txt

私は、所有者(ファイルを作成したコンピューターのユーザーだと思った)だけがファイルを読み取り、書き込み、および実行可能にすることを考え、望んでいました。

ありがとう!私はこれで新しいです!

5
bretonics

はい。

これはすべて、宛先で誰がファイルを作成するかによって異なります。これを試して:

$ touch some_file
$ ls -l some_file
-rw-r--r-- 1 userA userA 0 Apr 9 17:44 some_file
$ ls -ln some_file
-rw-r--r-- 1 501 501 0 Apr 9 17:44 some_file

したがって、私の例では、userAの数値uidは501です。

次にそれを転送し、userBとしてリモートシステムにログインします。

$ scp some_file userB@computerB:
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 userB users 0 Apr 9 17:50 some_file
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 1743 20 0 Apr 9 17:50 some_file

ここに表示されているように、userBはファイルを作成し、userBは数値のuid1743を持っています。タイムスタンプがどのように変更されたかも参照してください。

これはscpのデフォルトの動作です。ただし、scpの「-p」オプションを使用すると、属性を保持できます。これはタイムスタンプと権限のみを保持し、重要なことに、所有権は保持しません。これはまさにあなたが探しているものかもしれません:

$ scp -p some_file userB@computerB:
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 userB users 0 Apr 9 17:44 some_file
$ ssh userB@computerB ls -l some_file
-rw-r--r-- 1 1743 20 0 Apr 9 17:44 some_file

Scp以外にも、リモートマシンでファイルを作成する方法はたくさんあります。NFS、FTP、WebDAV ...これらは異なる方法で動作しますが、同様に予測可能な方法です。しかし、夢中にならないようにしましょう-あなたはscpについて尋ねました。

(OT注、実際には754のアクセス許可でファイルを作成しました!rwx = 111 = 7、rx = 101 = 5、r- = 100 = 4 –ご覧のとおり、r、w、およびxは8進ワードのビットです。ここでr = 4、w = 2、x = 1。そのため、アクセス許可に関連して8進数への参照が表示されます。訂正してくれたernieに感謝します!)

1
Rich

ローカルからリモートにコピーする場合のscpの一般的な形式は次のとおりです。

scp localfile username@remotehost:/some/remote/directory

この場合、リモートシステムにusernameとしてログインするようにscpに指示します。これは、書き込みで使用されるユーザー名です。あなたの例では、ファイルをコンピューターBにscpするときにuserBを使用した可能性があります。

リモートファイルをローカルホストにコピーしていた場合、例:

scp username@remotehost:/some/remote/file /some/local/directory

この場合、リモートシステムにusernameとしてログインし、scpコマンドを実行しているユーザーとしてローカルに書き込みます。この例では、現在ログインしているユーザーとして、リモートホストから実行しているシステムにファイルをコピーします(書き込みは現在ログインしているユーザーによって実行されるため)。そこからファイルを読み取り、それをローカルホストにコピーするだけなので、これはリモートホスト上の何にも影響しません。リモートファイルを読み取ることができるため、ファイルをローカルに書き込む場合と同様に、ローカルファイルには書き込み権限が必要です。

別の言い方をすれば、ファイルの所有者は通常、ファイルの作成者と一致します。したがって、userAとしてログインし、ファイルを書き込む場合、所有者はuserAになります。より簡単な例は次のようなものです。

user@server:~$ ls -l /var/log/syslog
-rw-r----- 1 syslog adm 6615 Apr  9 17:09 /var/log/syslog  

このファイルはsyslogが所有していますが、ユーザーが属しているadmグループ内の誰でも読み取り可能であることに注意してください。次に、ファイルをユーザーのホームディレクトリ(〜/)にコピーすると、次のようになります。

user@server:~$ cp /var/log/syslog ~/
user@server:~$ ls -l ./syslog
-rw-r----- 1 user user 6615 Apr  9 17:10 ./syslog

コピーされたファイルのバージョンは現在userによって所有されていることに注意してください。 scpは同じことをしていますが、ソースまたは宛先が別のユーザーとして別のシステムにログインする必要がある場合があります。

権限は、ユーザーの数値表現であるユーザーIDで追跡されることに注意してください。 idコマンドで現在のUIDを確認できます。一般に、個々のシステムの場合、アカウントが共有されないため、UIDはシステム間で同じにはなりません(LDAPなどを使用している場合を除く)。従来、0はルートであり、1000未満のUIDはシステムアカウント(メール、ニュース、ビン、デーモンなど)用に予約されており、通常のユーザーは1000から始まると思います。私の知る限り、通常のユーザーUIDが割り当てられます。したがって、3つのアカウントを作成した場合、それらは1000、1001、および1002になる可能性があります。

読み取り専用ファイルを送信する方法についての元の質問に戻ると、リモートシステムのリーダーがファイルの所有者と同じUIDを持っていないことを確認する必要があります。つまり、あなた(userA)がuserBのファイルを準備している場合、次のようなことができます。

scp localfile userA@remotehost:/some/remote/directory

この場合、ファイルの所有者は最終的にuserAになり(そしてuserAは、ログインしているユーザーとしてリモートシステムに存在することがわかります)、userBには書き込み権限がありません(ファイルが元々755であったと仮定します)。 )。 編集:権限を保持するために-pが必要な場合がありますか?

もちろん、userBにrootまたはSudoのアクセス許可がある場合は、何をしてもファイルを書き込み可能にすることができます。

1
ernie

ファイルをソースから宛先に転送する場合、アクセス許可と実際の所有権は転送のパラメーターの影響を受けます。 @ernieが言ったように、所有権はファイルの転送方法によって異なります。

権限は、ファイルの umask によって異なります。

古い学校のFTPサーバーの場合、umaskは通常FTPサーバー構成で設定されます。 SFTPサーバー(cp over SSH、またはscp)の場合、 この回答に従ってssh用のPAMプラグインを設定する必要があります サーバー障害でオーバー。

0
PaulProgrammer