scpを使用してアップロード時にアクセス許可を変更する


44

scpを使用してシェルアカウントにファイルをアップロードしています。サーバーとコンピューターでは異なるアクセス許可が必要なので、アカウントにsshして手動で変更することなく、アップロード時にアクセス許可を簡単に変更する方法が必要です。

回答:


29

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

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

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

私もそれについて考えましたが、ディレクトリをアップロードするのはどうですか?
フロリアンメイヤー

ええと、chmod -Rを実行できます。悪い考えではないでしょう。
フロリアンメイヤー

1
右。scp -r、ssh chmod -R
ジグドン08年

1
私はまた、(パテパッケージから)のplinkとPSCPと同じことをやって成功していた
stevepastelan

22

私の好ましい作業ソリューションは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には、所有者やグループなどを保持できるなどの価値を追加する可能性のある他の多くのオプションもあります。


これは機能していません。
ソハム

1
原因を見つけました。--perms同様に使用する必要があります。explainshell.com/...
ソーハム

5
完全な、有効な、コマンド、pelaseを表示できますか コメントとして、または回答を製作中のいずれかによって
Mawg

6

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

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


3
これは答えではなくコメントでなければなりません
ハイメハブルッツェル14

2
Agred(しかし、本当に助けになりました;-)
Mawg

これは、スクリプトを使用して一度に回避しようとしているものです。Rsyncは常に宛先サーバー上にあるとは限らず、私が提供するスクリプトがrsyncをインストールするためにapt / yumなどと自由にならないようにします。アクセス許可が正しいことを確認するためにscp + chmodまたはrm + scpメソッドを使用する必要があるようです。:-/
zaTricky

5

次のように、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でtaredされてSTDOUT(aka。-)で送信され、host2でtarされていないファイルを確認できるようにするためです。

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


1
このコマンドでわかるように、転送されたファイルに適用できるumask権限は、たとえば、ローカルファイルの700場合755は宛先サーバーでファイルを取得できませんでしたか、間違っていますか?
ハイメHablutzel 14

1
さらに、次のものが必要--no-same-permissions秒間tar宛先ユーザがルートであるかどうかを確認し、利用状況superuser.com/a/383801/89031
ハイメHablutzel

@jaime-正しいです。これによりumask、リモートサーバーに書き込まれるファイルセット全体に対してのみを設定できます。異なるファイルを個別に制御することはできません。たとえば、リモート展開にコピーするときに、ラップトップでOKだったリラックスしたアクセス許可を削除するため、これを頻繁に使用します。
slm 14

@jaime-は、manページに--no-same-permissionsよると正しいtarです。この例ではプロンプトを変更しているため、混乱はありません。
slm 14

3

Pythonでタスク用の小さなスクリプトを作成しました。あなたは行うことができますのpython script.py -p O +いくつかのファイルがいくつかの/ディレクトリ/上/ /サーバーをR /

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)

3
Code Reviewにコードを投稿しても構いませんか。改善方法については、良い提案があるかもしれません。
-tshepang

1
うわー、私は新しいSOサイト、コードレビュー、ty @Tshepangのことを聞いたことがありません!
AnneTheAgile

2
@AnneTheAgileそれはそれほど新しいものではありません。それは3歳以上です:)
tshepang 14

1

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

chmod 1644 dir

上記で使用した「1」はスティッキービットを設定します。

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


誰かがこれがどのように機能するかを説明できますか?
Mawg

0

UNIXバリアントにアップロードする場合、パーミッションはUMASK設定に従う必要があると思います。どのドットファイルがSCP用に処理されるかを頭の中で思い出すことはできませんが、これらのファイルのいずれかにUMASKを設定すると、作成するファイルに基づいてアクセス許可が設定されます。おそらく、リモートシステムで使用するシェルに依存します。

何をするにしても、-pオプションは使用しないでください。


いや。-pは、ローカルマシンとは異なるサーバー(UNIXの場合)のアクセス許可が必要なため、望んでいたものではありません。もちろん、それらをchmodし、-pを使用してから再びchmodすることもできますが、その場合はアクセス許可を保存する必要があります。
フローリアンメイヤー

-pを使用することを提案していませんでした。投稿を明確にします。
tvanfosson 08年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.