Это не удается, потому что вы должны быть целью (владельцем файла ), cp не отменяет базовую безопасность Unix. Пользователь может сохранять свои собственные файлы, wilmes -> wilmes, но не может делать это для других пользователей, и уж точно не для root. Я предполагаю, что вы не вошли в систему ни как root, ни как wilmes.
В этом случае один файл принадлежит пользователю root, а другой — пользователю wilmes. Для сохранения попробуйте запустить:
sudo cp -p b a
Соответствующие ссылки:
Пример:
Создать файл для root, a, и файл для обычного пользователя (joe ), b.
joe@testbed:~/tmp2$ sudo touch a
joe@testbed:~/tmp2$ touch b
Проверьте правильность разрешений.
joe@testbed:~/tmp2$ ls -l
total 0
-rw-r--r-- 1 root root 0 Jun 22 13:51 a
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 b
Попытка скопировать принадлежащий пользователю файл b поверх файла, принадлежащего пользователю root (, что нарушит права доступа):
joe@testbed:~/tmp2$ cp -p b a
cp: cannot create regular file 'a': Permission denied
Повторите копирование как root, права доступа сохранены:
joe@testbed:~/tmp2$ sudo cp -p b a
joe@testbed:~/tmp2$ ls -l
total 0
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 a
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 b
Примечание :Отказано в доступе, а не Операция не разрешена . Я предполагаю, что вы видите не разрешено, потому что пользователь wilmes ДЕЙСТВИТЕЛЬНО имеет доступ к файлу через группу, однако он не является владельцем , поэтому он не может полностью перезаписать его.
По логике, вы заменяете файл, принадлежащий другому пользователю (root ), и просите систему также сделать вас владельцем этого файла, что было бы катастрофической уязвимостью в системе безопасности.
Например, что, если бы я пришел как обычный пользователь malicious.username01
и захотел заменить crontab на что-то вроде ntp, принадлежащего root? Если бы то, что вы пытаетесь сделать, сработало, я мог бы просто написать свою собственную вредоносную версию, а затем просто cp -p my-malicious-script /etc/cron.daily/ntp
. Это было бы ужасно. Действительно очень ужасно.
Одинарные кавычки в одиночной -строке в кавычках нельзя экранировать, но, к счастью, вы можете просто использовать двойные кавычки вокруг определения псевдонима, а затем (экранированные )двойные кавычки вокруг имени каталога:
alias windocs="cd \"/mnt/c/Users/Firstname L'astname/Documents/\""
В качестве альтернативы вы можете сделать символическую ссылку на этот каталог в свой домашний каталог Linux:
ln -s "/mnt/c/Users/Firstname L'astname/Documents/" ~/docs
А затем, простоcd docs
(или cd ~/docs
, если вы не в своем домашнем каталоге, )доставит вас туда.
Ну, я должен был сначала посмотреть это. Я поместил всю строку в двойные -кавычки в соответствии с этим ответом stackoverflow :
alias windocs="cd /mnt/c/Users/Firstname\ L\'astname/Documents/"
и теперь это работает. Это связано с тем, что нет механизма выхода из строк с одинарными кавычками -, но есть для строк с двойными кавычками (в соответствии с другим ответом ).
Для подсистемы Windows для Linux (WSL )только , переменные среды Windows можно сопоставить с $WSLENV
переменной среды на стороне WSL. Например, /mnt/c/Users/username/
на стороне Windows сохраняется как переменная среды %USERPROFILE%
.
Для этого сначала добавьте переменную в Windows, выполнив эту команду от имени администратора в командной строке
setx WSLENV USERPROFILE
Затем добавьте псевдоним в.bashrc
(или подобные файлы ). Например,
alias windocs='cd $(wslpath $USERPROFILE/Documents)'
Здесь wslpath
преобразует путь в стиле Windows (обратная косая черта )в *путь в стиле NIX (косая черта ). На схемах
Windows <---> WSL
C:\Users\username <---> /mnt/c/Users/username
USERPROFILE <---> WSLENV
Дополнительную информацию см. в блоге Совместное использование переменных среды между WSL и Windows .