web-dev-qa-db-ja.com

scpでアップロードするときに権限を変更する

Scpを使用して自分のShellアカウントにファイルをアップロードしています。サーバーとコンピューターでは異なるアクセス許可が必要なため、アップロード時にアクセス許可を簡単に変更して、アカウントにSSHでアクセスして手動で変更する必要がないようにしたいと考えています。

46
Florian Mayer

Windowsマシンからコピーする場合は、 WinSCP を使用してコピーできます。アップロード後に、コピーしたファイルに対する権限を設定するオプションがあります。

そうでない場合は、アップロード後にサーバーでchmodを実行するのが唯一の選択肢だと思います。これは、sshコマンドを使用してリモートで実行できます。

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
33
zigdon

私が好む解決策は、代わりにrsyncを使用することです。

交換:

scp /path/to/file server:/server/path/to/file

と:

rsync --chmod=u+rwx,g+rwx,o+rwx /path/to/file server:/path/to/file

これにより、2回の認証を防ぐことができます。 rsync を使用する他のオプションもたくさんあります。これにより、所有者、グループなどを保持できるなどの価値が高まるでしょう。

24
JRomero

Scpでいくつかの実験を行いました。ターゲットサーバーにアップロードされた新しいファイルの場合、ファイルにはソースサーバーと同じ権限が付与されます。ターゲットサーバーで既存のファイルが上書きされた場合、それらのファイルのアクセス許可は変更されません。

私はCentOS 4.6でこれらの実験を行いました。

6
Jingguo Yao

次のようにtar、ssh、およびumaskを使用して実行できます。

ホスト1:

[saml@Host1 testdir]$ pwd
/tmp/testdir

[saml@Host1 testdir]$ ls -l
total 12
-rw-r--r--  1 saml saml 21 May 19 00:21 file1
-rw-r--r--  1 saml saml 48 May 19 00:21 file2
-rw-r--r--  1 saml saml 28 May 19 00:21 file3

[saml@Host1 testdir]$ tar cvf - . | (ssh Host2 "umask 0277; cd /tmp/testdir;tar xvf -")
./
./file1
./file2
./file3
./
./file1
./file2
./file3

host2:

[samr@Host2 testdir]$ pwd
/tmp/testdir

[samr@Host2 testdir]$ ls -l
total 12
-r-------- 1 samr web 21 May 19 00:21 file1
-r-------- 1 samr web 48 May 19 00:21 file2
-r-------- 1 samr web 28 May 19 00:21 file3

-vスイッチをここに含めたtarにドロップするだけで、Host1でtarされ、STDOUT(別名-)を介して送信され、Host2でun-tarされているファイルを確認できます。

注:なぜこれが機能するのですか? Tarのデフォルトの動作は、リモートユーザーのumaskを使用してファイルを解凍することです。上記の例では、maskコマンドを明示的に別の値に設定して、リモートtarがリモート側のアクセス許可を変更していることを示しています。

6
slm

このタスク用の小さなスクリプトをPythonで作成しました。あなたができるpython script.py -p o + r some files some/dir/on/the/server /

import subprocess
import sys
from optparse import OptionParser


DEFAULT_SERVER = 'your.server.com'

parser = OptionParser()

parser.add_option("-p", "--permissions", action="store", 
                     type="str", dest="perm", metavar="PERM",
                     help="chmod files to PERM", default=None)
parser.add_option("-s", "--server", action="store", 
                     type="str", dest="serv", metavar="SERVER",
                     help="scp to SERVER", default=DEFAULT_SERVER)

options, args = parser.parse_args()
files = args[:-1]
direct = args[-1]

proc = subprocess.Popen(['scp'] + files + ['%s:%s' % (options.serv, direct)],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if proc.wait() != 0:
    print >>sys.stderr, "Uploading failed!"
    sys.exit(1)

if options.perm is not None:
    arg_dict = dict(dir=direct, perm=options.perm, files=' '.join(files))
    proc = subprocess.Popen(['ssh', options.serv, 'cd %(dir)s;'
                             'chmod -R %(perm)s %(files)s' % arg_dict],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
4
Florian Mayer

フォルダーにスティッキービットを設定して、そのフォルダーの下にアップロードしたファイルにそのアクセス許可が自動的に付与されるようにすることをお勧めします。

chmod 1644 dir

上記の「1」は、スティッキービットを設定します。

そのため、1つをアップロードするだけで、後で別のコマンドを実行する必要はありません。

1
DaveDeveloper

あなたがUNIXバリアントにアップロードしていると仮定すると、許可はUMASK設定に従う必要があると思います。どのドットファイルがSCPのために処理されるかを頭の上から思い出しませんが、UMASKをそれらの1つに設定すると、作成するファイルはそれに基づいて権限が設定されます。おそらく、リモートシステムで使用するシェルによって異なります。

何をするにしても、-pオプションを使用しないでください。-pオプションを使用すると、目的とは正反対になります。

0
tvanfosson