scpを使用してシェルアカウントにファイルをアップロードしています。サーバーとコンピューターでは異なるアクセス許可が必要なので、アカウントにsshして手動で変更することなく、アップロード時にアクセス許可を簡単に変更する方法が必要です。
scpを使用してシェルアカウントにファイルをアップロードしています。サーバーとコンピューターでは異なるアクセス許可が必要なので、アカウントにsshして手動で変更することなく、アップロード時にアクセス許可を簡単に変更する方法が必要です。
回答:
Windowsマシンからコピーする場合は、WinSCPを使用してコピーできます。また、アップロード後にコピーされたファイルにアクセス許可を設定するオプションがあります。
そうでない場合、アップロード後にサーバーでchmodを実行することが唯一の選択肢だと思います。これは、sshコマンドを使用してリモートで実行できます。
scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
私の好ましい作業ソリューションは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には、所有者やグループなどを保持できるなどの価値を追加する可能性のある他の多くのオプションもあります。
--perms
同様に使用する必要があります。explainshell.com/...
私はscpでいくつかの実験を行いました。ターゲットサーバーにアップロードされた新しいファイルの場合、ファイルにはソースサーバーと同じ権限があります。ターゲットサーバーで既存のファイルが上書きされた場合、それらのファイルのアクセス許可は変更されません。
これらの実験はCentOS 4.6で行いました。
次のように、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がリモート側のアクセス権を変更していることを示しています。
umask
権限は、たとえば、ローカルファイルの700
場合755
は宛先サーバーでファイルを取得できませんでしたか、間違っていますか?
umask
、リモートサーバーに書き込まれるファイルセット全体に対してのみを設定できます。異なるファイルを個別に制御することはできません。たとえば、リモート展開にコピーするときに、ラップトップでOKだったリラックスしたアクセス許可を削除するため、これを頻繁に使用します。
--no-same-permissions
よると正しいtar
です。この例ではプロンプトを変更しているため、混乱はありません。
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)
フォルダーにスティッキービットを設定して、そのフォルダーの下にアップロードしたファイルがその許可を自動的に取得することをお勧めします。
chmod 1644 dir
上記で使用した「1」はスティッキービットを設定します。
そのため、1つをアップロードするだけで、後で別のコマンドを実行する必要はありません。
UNIXバリアントにアップロードする場合、パーミッションはUMASK設定に従う必要があると思います。どのドットファイルがSCP用に処理されるかを頭の中で思い出すことはできませんが、これらのファイルのいずれかにUMASKを設定すると、作成するファイルに基づいてアクセス許可が設定されます。おそらく、リモートシステムで使用するシェルに依存します。
何をするにしても、-pオプションは使用しないでください。