我不小心跑了
sudo chmod 755 -R /
代替
sudo chmod 755 -R ./
几秒钟后我停止了它,但现在我开始遇到问题。例如,sudo
不再起作用:
sudo: must be setuid root
我怎样才能恢复权限?
答案1
简而言之:你不能,重新安装系统。
我的意思是,Posix 权限被大量使用和依赖;文件系统中有很多地方,错误的权限会破坏操作系统(SUID 标志),甚至更糟,使其在安全方面暴露(/etc/ssh/ssh_host_rsa_key
),尽管它看起来工作正常。
因此,这样的恢复很难正确进行。一件事——然后你就把事情搞砸了。你已经搞砸了你的sudo chmod
命令(如果那是你的朋友而不是你,她也可能学习一些 Linux 课程)——这是一个非常简单的命令。正确的恢复需要更多的命令和更多的警惕。即使你使用某人的脚本。
所以相信我,只需重新安装即可。这是一个安全的选择,保证让您远离麻烦。
最后,这里有一些相关的提示。
首先:如果你/home
在单独的分区上设置下次。实际上,这会很轻松。
第二:考虑做疯狂的 Linux 科学在一个虚拟机像 VirtualBox 一样,并进行快照。
第三:chmod -R .
有效。点本身.
就是有效的目录名。没有必要附加那个斜线。你可以完全避免跳过点的灾难性风险;
仅仅chmod: missing operand after ‘755’
是 VS 一个被破坏的系统。
答案2
我编写了几个 Ruby 脚本来管理rsync
权限和所有权,并且已经使用了好几年。脚本get-filesystem-acl
通过递归遍历所有文件来收集所有信息,并将其全部放入文件 中.acl
。脚本.acl-restore
将读取.acl
并应用所有chown
和chmod
。
您可以get-filesystem-acl
在类似的 Ubuntu 安装上运行,然后将文件复制.acl
到 chmod 损坏的框中,将.acl
和.acl-restore
放入 /,然后运行.acl-restore
。
您需要具有 root 权限,以便sudo
按照 Marco Ceppi 的建议进行修复。
我可以生成并提供给你.acl
适用于我的 Ubuntu 的文件。
get-filesystem-acl
#!/usr/bin/ruby
RM = "/bin/rm"
SORT = "/usr/bin/sort"
TMP = "/tmp/get_acl_#{Time.now.to_i}_#{rand * 899 + 100}"
require 'find'
IGNORE = [".git"]
def numeric2human(m)
return sprintf("%c%c%c%c%c%c%c%c%c",
(m & 0400 == 0 ? ?- : ?r),
(m & 0200 == 0 ? ?- : ?w),
(m & 0100 == 0 ? (m & 04000 == 0 ? ?- : ?S) :
(m & 04000 == 0 ? ?x : ?s)),
(m & 0040 == 0 ? ?- : ?r),
(m & 0020 == 0 ? ?- : ?w),
(m & 0010 == 0 ? (m & 02000 == 0 ? ?- : ?S) :
(m & 02000 == 0 ? ?x : ?s)),
(m & 0004 == 0 ? ?- : ?r),
(m & 0002 == 0 ? ?- : ?w),
(m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
(m & 01000 == 0 ? ?x : ?t)))
end
File.open(TMP, "w") do |acl_file|
# TODO: Instead of the current dir, find the .git dir, which could be
# the same or outside of the current dir
Find.find(".") do |path|
next if IGNORE.collect {|ig| !!(path[2..-1] =~ /\A#{ig}/)}.include? true
next if File.symlink?(path)
stat = File.lstat(path)
group_id = stat.gid
rules = "#{type}#{numeric2human(stat.mode)}"
acl_file.puts "#{path} #{rules} #{owner_id} #{group_id}"
end
end
`#{SORT} #{TMP} > .acl`
`#{RM} #{TMP}`
.acl-restore
#!/usr/bin/ruby
# This script will only work with .acl_ids
# Restore from...
FROM = ".acl"
MKDIR = "/bin/mkdir"
CHMOD = "/bin/chmod"
CHOWN = "/bin/chown"
known_content_missing = false
def numeric2human(m)
return sprintf("%c%c%c%c%c%c%c%c%c",
(m & 0400 == 0 ? ?- : ?r),
(m & 0200 == 0 ? ?- : ?w),
(m & 0100 == 0 ? (m & 04000 == 0 ? ?- : ?S) :
(m & 04000 == 0 ? ?x : ?s)),
(m & 0040 == 0 ? ?- : ?r),
(m & 0020 == 0 ? ?- : ?w),
(m & 0010 == 0 ? (m & 02000 == 0 ? ?- : ?S) :
(m & 02000 == 0 ? ?x : ?s)),
(m & 0004 == 0 ? ?- : ?r),
(m & 0002 == 0 ? ?- : ?w),
(m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
(m & 01000 == 0 ? ?x : ?t)))
end
def human2chmod(mode)
raise unless mode =~ /([r-][w-][xtsTS-])([r-][w-][xtsTS-])([r-][w-][xtsTS-])/
triple = [$1, $2, $3]
u,g,o = triple.collect do |i|
i.sub('s', 'sx').sub('t', 'tx').downcase.gsub('-', '')
end
return "u=#{u},g=#{g},o=#{o}"
end
File.open(FROM).each do |acl|
raise unless acl =~ /\A(([^ ]*? )+)([^ ]+) ([^ ]+) ([^ ]+)\Z/
path, rules, owner_id, group_id = $1, $3, $4, $5
path = path.strip
owner_id = owner_id.to_i
group_id = group_id.to_i
if !File.exists?(path) and !File.symlink?(path)
if rules =~ /\Ad/
STDERR.puts "Restoring a missing directory: #{path}"
STDERR.puts "Probably it was an empty directory. Git goes not track them."
`#{MKDIR} -p '#{path}'` # Creating the any parents
else
known_content_missing = true
STDERR.puts "ERROR: ACL is listed but the file is missing: #{path}"
next
end
end
s = File.lstat(path)
t = s.ftype[0..0].sub('f', '-') # Single character for the file type
# But a "-" istead of "f"
# Actual, but not neccesarely Desired
actual_rules = "#{t}#{numeric2human(s.mode)}"
actual_owner_id = s.uid
actual_group_id = s.gid
unless [actual_rules, actual_owner_id, actual_group_id] ==
[rules, owner_id, group_id]
chmod_argument = human2chmod(rules)
# Debug
#p chmod_argument
#p s.mode
## Verbose
puts path
puts "Wrong: #{[actual_rules, actual_owner_id, actual_group_id].inspect}"
puts "Fixed: #{[rules, owner_id, group_id].inspect}"
`#{CHMOD} #{chmod_argument} '#{path}'`
#puts
end
end
if known_content_missing
STDERR.puts "-" * 80
STDERR.puts "Some files that are listed in #{FROM.inspect} are missing in " +
"the current directory."
STDERR.puts
STDERR.puts "Is #{FROM.inspect} outdated?"
STDERR.puts "(Try retrograding the current directory to an earlier version)"
STDERR.puts
STDERR.puts "Or is the current directory incomplete?"
STDERR.puts "(Try to recover the current directory)"
STDERR.puts "-" * 80
end
答案3
简而言之:你可以。你需要从 Live CD 安装文件系统,然后开始在适当的位置恢复权限。至少要恢复 sudo,你需要sudo chmod u+s /usr/bin/sudo
在 LiveCD 会话中运行 - 这将修复必须为 setuid root 的问题。
不过,重新安装系统可能会更简单。
答案4
我将尝试使用 重新安装所有软件包apt-get install --reinstall
,并可能使用 的输出dpkg --get-selections | grep install
来获取它们的列表。