Take the 2-minute tour ×

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.

share|improve this question

migrated from stackoverflow.com Jun 2 '11 at 0:48

This question came from our site for professional and enthusiast programmers.

7 Answers 7

up vote 8 down vote accepted

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
share|improve this answer
I thought about that too, what about uploading directories then? –  Florian Mayer Oct 11 '08 at 17:16
Hm, I could do chmod -R then. Not a bad idea I guess. –  Florian Mayer Oct 11 '08 at 17:22
Right. scp -r, then ssh chmod -R –  zigdon Oct 11 '08 at 17:47
I also had success doing the same thing with plink and pscp (from the putty package) –  stevepastelan May 22 '13 at 21:49

My preferred working solution would be to use rsync instead:




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

This prevents you from authenticating twice. There are also a lot of other options with rsync which would probably add value such as being able to preserve owner, group, etc.

share|improve this answer

You could do it using tar, ssh, & umask like this:

on host 1:

[saml@host1 testdir]$ pwd

[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 -")

on host2:

[samr@host2 testdir]$ pwd

[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

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.

NOTE: Why this works? Tar's default behavior is to unpack files using a remote user's umask. In the above example I've included the command umask to explicitly set it to something different which demonstrates that the remote tar is changing the permissions on the remote side.

share|improve this answer
As I can see with this command you can only apply fewer permissions to transferred files, as umask only substract permissions, e.g. for a local file with 700 you couldn't get the file with 755 in the destination server, or am I wrong? –  Jaime Hablutzel Jul 10 at 9:13
Furthermore you need --no-same-permissions for the second tar usage if the destination user is root, see superuser.com/a/383801/89031 –  Jaime Hablutzel Jul 10 at 9:14
@jaime - that is correct, this will only allow you to set the umask for the entire set of files as they're written to the remote server. There is no individual control for different files. I'll often use this since I want to strip relaxed permissions that were OK on my laptop, when copying to a remote deployment, for example. –  slm Jul 10 at 12:41
@jaime - the --no-same-permissions is correct as well according to tar's man page. I've changed the prompts in my example so there is no confusion on that. –  slm Jul 10 at 12:44

I have made some experiments with scp. For new files uploaded to the target server, the files have the same permissions as on the source server. If existing files are overwritten on the target server, the permissions for those files don't change.

I have do these experiments with CentOS 4.6.

share|improve this answer
This should be a comment instead of an answer –  Jaime Hablutzel Jul 10 at 9:26

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!"

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)
share|improve this answer
Do you mind posting your code at Code Review. There could be nice suggestions there for how it can be improved. –  Tshepang Jul 21 '11 at 13:38
Wow, I never heard of the new SO site, Code Review, ty @Tshepang! –  AnneTheAgile Aug 1 at 18:52
@AnneTheAgile it's not that new; it's over 3 years old :) –  Tshepang Aug 1 at 20:55

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.

share|improve this answer
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 Oct 11 '08 at 17:05
I wasn't suggesting that you use -p, just confirming that you were. I'll clarify my post. –  tvanfosson Oct 11 '08 at 17:18

I would suggest setting up sticky bit on the folder so that the files you upload under that folder gets that permission automatically.

chmod 1644 dir

"1" used above sets the sticky bit.

so you only have to upload one and not have to run another command afterwards.

share|improve this answer

Your Answer


