8

I was wanting to use scp to move some files and overwrite any existing instances of these files on the destination server. Some of them may be read only which, of course, courses the scp to fail with "permission denied". I couldn't seem to find a --force type switch for scp; is this possible?

I am aware of rsync but this is not currently available on the destination server.

Aaron
  • 1,507

4 Answers4

3

You cannot modify/overwrite any file if you don't have write permission, and no possible scp option may change that.

In order to solve it you should connect to the server first (using ssh for instance) and modify the permission on your file. If you don't know how to do it, here's a simple command which does the trick:

chmod +w /path/to/your/file

A few notes:

  • There's probably a reason why these files are read-only. Before doing anything, make sure you know why and that changing this is not going to break anything or introduce security holes.

  • If necessary you could remove the write permission after executing your scp command (with this: chmod -w /path/to/file).

  • If there are too many files with read-only permission, you need to hunt them down. find (at least the GNU version available in most Linux distributions) has a -perm test which you can use (man find for more info).

  • Someone might suggest that you connect as root or use sudo. It'll work, but for the love of God don't. I cannot begin to tell you how wrong this would be.

rahmu
  • 20,023
  • 2
    As long as you have write perms on the containing directory, you can remove / rename a read-only file -- e.g. https://gist.github.com/4704937 – Reed Kraft-Murphy Feb 04 '13 at 03:53
2

If SFTP is available on the server (it usually is), you can use SSHFS. This lets you mount the remote files on the client. You need an SFTP daemon on the server and FUSE on the client.

mkdir /net/myserver
sshfs myserver:/ /net/server

You can then use any local command such as cp, chmod, rsync, etc., without having to worry whether the files are local or remote. With rsync, pass the --no-whole-file option to tell it to use its bandwidth-saving delta-transfer algorithm (which is otherwise turned off when rsync believes that both paths are local).

rsync -a --no-whole-file somedir /net/myserver/somewhere
1

Rsync needn't be on the destination server; you can use

# rsync -avz -e ssh /path/to/files/ blah@somehost.com:/tmp/ 

Info on this here:

http://troy.jdmz.net/rsync/index.html

As said earlier though, don't take read only files lightly; I'll assume you know exactly what you're doing. Another method though is to scp or rsync the files into a /tmp/blah directory on the destination server, and then move them once written.

Stephan
  • 2,911
0

If scp is giving you 'permission denied error' on a given file (but ssh -v shows authentication successful) then the problem is that you are trying to overwrite an existing file with other set of permissions or the file may have another owner (with other sets of permissions).

Try removing the original file. Then subsequent scps will overwrite.