How do you use the cp
command without changing the target file's permissions? For example:
cp /tmp/file /home/file
I don't want to change chown
and chgrp
on /home/file
.
How do you use the cp
command without changing the target file's permissions? For example:
cp /tmp/file /home/file
I don't want to change chown
and chgrp
on /home/file
.
If you've only opened the manual for cp
...
The next will not overwrite the file permissions and ownership + groupship:
cp --no-preserve=mode,ownership /tmp/file /home/file
Note that root privileges are needed if you want to preserve the ownership and groupship.
An excerpt from the manual:
--preserve[=ATTR_LIST] preserve the specified attributes (default: mode,owner- ship,timestamps), if possible additional attributes: context, links, xattr, all
cat
will work, too:
cat /tmp/file > /home/file
By default, GNU cp
(version 8.32) will NOT overwrite destination permissions, so the question is moot:
% ls -li
total 8,192
19392015 -rwxrwxrwx 1 ravi ravi 4 Jan 3 16:54 bar*
19392014 -rw-r--r-- 1 ravi ravi 4 Jan 3 16:46 foo
% cp foo bar
% ls -li
total 8,192
19392015 -rwxrwxrwx 1 ravi ravi 4 Jan 3 16:57 bar*
19392014 -rw-r--r-- 1 ravi ravi 4 Jan 3 16:46 foo
%
In the case where the destination file is not writable (even though the directory is), cp
will say:
cp: cannot create regular file 'dest-file': Permission denied
Other options besides cp
:
cat
will preserve the inode and permissions of the destination file:
cat file-with-new-data > file-to-overwrite
However, redirections won't work with sudo
.
If you want to sudo
and keep the destination permissions, use this:
< file-with-new-data sudo tee file-to-overwrite > /dev/null
This is equivalent to the more verbose:
cat file-with-new-data | sudo tee file-to-overwrite > /dev/null
Or you can use even better install program from GNU coreutils that has been made for this particular purpose. Please note it is not able to recurse (no -R or -r option).
http://www.gnu.org/software/coreutils/manual/html_node/install-invocation.html
Don't use permission-related switches at all, especially --no-preserve
, because it behaves strangely:
good:
[il@localhost Downloads]$ sudo cp ssh_host_* /etc/ssh/
[il@localhost Downloads]$ ls -l /etc/ssh
total 604
-rw-r--r-- 1 root root 581843 Oct 20 2017 moduli
-rw-r--r-- 1 root root 2276 Oct 20 2017 ssh_config
-rw------- 1 root root 3907 Oct 20 2017 sshd_config
-rw-r-----. 1 root ssh_keys 227 Oct 2 12:26 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 172 Oct 2 12:26 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 411 Oct 2 12:26 ssh_host_ed25519_key
-rw-r--r--. 1 root root 100 Oct 2 12:26 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 1679 Oct 2 12:26 ssh_host_rsa_key
-rw-r--r--. 1 root root 392 Oct 2 12:26 ssh_host_rsa_key.pub
bad:
[il@localhost Downloads]$ sudo cp --no-preserve=mode,ownership ssh_host_* /etc/ssh/
[il@localhost Downloads]$ ls -l /etc/ssh
total 604
-rw-r--r-- 1 root root 581843 Oct 20 2017 moduli
-rw-r--r-- 1 root root 2276 Oct 20 2017 ssh_config
-rw------- 1 root root 3907 Oct 20 2017 sshd_config
-rw-r--r--. 1 root ssh_keys 227 Oct 2 12:27 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 172 Oct 2 12:27 ssh_host_ecdsa_key.pub
-rw-r--r--. 1 root ssh_keys 411 Oct 2 12:27 ssh_host_ed25519_key
-rw-r--r--. 1 root root 100 Oct 2 12:27 ssh_host_ed25519_key.pub
-rw-r--r--. 1 root ssh_keys 1679 Oct 2 12:27 ssh_host_rsa_key
-rw-r--r--. 1 root root 392 Oct 2 12:27 ssh_host_rsa_key.pub
The cp doesn't override permissions by default. If you want to make sure permission won't be overridden, use
cp --preserve=mode,ownership /tmp/file /target_dir_where_file_resides