如何在不更改文件所有者的情况下将命令与sudo一起使用?


12

当我使用sudo对文件进行某些活动时,这些文件会更改所有权。如何在不更改文件所有者的情况下将命令与sudo一起使用?

示例文件archivos35.sh来自apache,但我使用sed(与usr admin sudo一起使用)

$ ls -l
-rwxr-xrw-. 1 apache apache 181 Aug 5 11:56 archivos35.sh

adminsudo 用户-

sudo sed -i s/old/new/g archivos35.sh

但是使用sudo执行该命令会更改文件的所有者

$ ls -l
-rwxr-xrw-. 1 admin apache 181 Aug 5 11:56 archivos35.sh

如何避免将命令与sudo一起使用来更改文件的所有者?我只想在不修改文件所有者的情况下对文件进行更改。


为什么您的脚本是世界可写的?
Jim L.

我误将其设置为756。我不应该这样做
Dok Gus,

Answers:


29

如果需要用于sudo修改文件,请使用它切换到正确的用户。您无需切换到root用户,这只是默认设置。因此,根据您的情况,您想执行以下操作:

sudo -iu apache sed -i 's/old/new/g' archivos35.sh

这将以sed用户身份运行命令apache


2

您并没有真正更改文件的所有权,而是要删除旧文件并创建一个新文件。执行此操作时,创建的新文件将由创建者的uid拥有。为避免这种情况,您必须在适当位置修改文件。使用文本编辑器对其进行编辑,该文本编辑器会通过覆盖原位置的文件进行保存。或运行带有输出的sed命令到临时文件,然后将临时文件复制到原始文件上。


1
您可能会认为该-i选项--in-place实际上会就地进行修改...
JShorthouse

惠特@teldon的回复,我设法做到了我所需要的。使用sed时,我无需打开文件即可修改该位置。
古斯

1
@JShorthouse您可能会想,但事实并非如此,至少并非到处都是。
凯尔·琼斯,

3
@JShorthouse并不是大多数所谓的“就地”编辑,它们大多是更改一个临时文件,然后将其替换为原始文件(包括sed和perl的大多数(如果不是全部)实现以及大多数其他程序)以及“就地编辑”选项)。如果需要实际的就地编辑,请使用可编写脚本的文本编辑器,例如edexvi/ vim
cas

1
甚至有些文本编辑器在写入文件时也使用temp + rename方法,以防万一在写入时崩溃。例如,Emacs默认情况下会这样做,但是您可以使用配置将其覆盖。
Barmar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.