views:

3354

answers:

4

I am uploading files to my shell account using scp. As I need different permissions on the server than on my computer, I'd like to have a way to easily change the permissions upon upload without needing to ssh to the account and change them manually.

A: 

Assuming you are uploading to a UNIX variant, I think that the permissions ought to follow your UMASK settings. I don't recall off the top of my head which dot-files get processed for SCP, but if you set your UMASK in one of those the files you create will have it's permissions set based on it. It probably depends on what shell you use on the remote system.

Whatever you do, don't use the -p option as it does the exact opposite of what you want.

tvanfosson
Nope. -p is not what I wanted because I need different permissions on the server(yes it's an UNIX) than on my local machine. I could of course chmod them, use -p and then chmod them back, though I'd need to store the permissions then.
Florian Mayer
I wasn't suggesting that you use -p, just confirming that you were. I'll clarify my post.
tvanfosson
+2  A: 

If you're copying from a windows machine, you can use WinSCP to copy, and it has an option to set the permissions on the copied files after the upload.

If not, I think your only choice is to execute a chmod on the server after the upload, which you could do remotely with an ssh command:

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
zigdon
I thought about that too, what about uploading directories then?
Florian Mayer
Hm, I could do chmod -R then. Not a bad idea I guess.
Florian Mayer
Right. scp -r, then ssh chmod -R
zigdon
A: 

I wrote a small script for the task in Python. You can do 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)
Florian Mayer
A: 

You could do it using tar and ssh like this:

on host 1: [root@host1 testdir]# pwd /tmp/testdir

[root@host1 testdir]# ls -l
total 12
-rw-r--r--  1 root web 21 May 19 00:21 file1
-rw-r--r--  1 root web 48 May 19 00:21 file2
-rw-r--r--  1 root web 28 May 19 00:21 file3

[root@host1 testdir]# tar cpvf - . | (ssh host2 "cd /tmp/testdir;tar xpvf -")
./
./file1
./file2
./file3
./
./file1
./file2
./file3

on host2: [root@host2 testdir]# pwd /tmp/testdir

[root@host2 testdir]# ls -l
total 12
-rw-r--r-- 1 root web 21 May 19 00:21 file1
-rw-r--r-- 1 root web 48 May 19 00:21 file2
-rw-r--r-- 1 root web 28 May 19 00:21 file3

You can drop the -v switches to tar which I've included here merely so that you can see the files being tarred up on host1 and sent through STDOUT (aka. -) and then getting un-tarred on host2.

slm

related questions