单一管理员计算机,用于仅在网络上具有常规帐户的系

如何让系统只有一个具有由单台计算机管理的管理任务的常规帐户?

我只是希望能够在单个系统中的所有计算机上添加/删除软件。 批发 – 不单独登录每台计算机并执行需要完成的任务。 我可以通过物理或SSH方式做到这一点,但是有一百台左右的计算机,这不是我想要考虑的选项。

要从中央计算机管理多台计算机,您可以尝试学习Puppet等系统管理平台。 它允许您从一台主机(puppetmaster)管理多台机器(木偶)。 根据您的情况,它可能有点矫枉过正,但它是从中央控制点管理许多机器的绝佳工具。 它还可以非常轻松地设置新计算机(或重新安装旧计算机),因为您可以从服务器中提取所有配置,程序包列表等。

这是一个指向安装和测试puppetmaster的ubuntu操作指南的链接。

隐藏管理员

每个系统至少需要一个管理用户,因为在Ubuntu中,禁用了不同的root帐户* 。 不过,通过在/etc/gdm/custom.conf添加以下行,可以从gdm登录中隐藏此用户“administrator”:

 [greeter] Exclude=nobody,administrator 

我们可能会进一步限制非管理用户对/home/administrator/读取访问权限。

对于管理任务,我们以本地用户身份登录(例如在命令行上或通过在GUI中选择其他人 ),或通过ssh远程登录。

定义ssh_config

为了向多个远程机器发出命令,我们需要在~/.ssh/ssh_config中定义一个本地配置文件 ,其中列出了登录我们的远程机器所需的详细信息,以及我们可以在哪里定义客户端的方便名称:

 # ssh configuration Host remote1 HostName 192.168.0.1 Port 22 User USERNAME Host remote2 HostName 192.168.0.2 Port 22 User USERNAME 

可能需要其他选项来进一步控制会话详细信息(例如禁用密码身份validation)。

在多个客户端上运行命令

我们现在编写一个脚本,连接到另一个客户端,以运行给定的命令:

 #!/bin/bash # run a command on multiple remotes REMOTES=$1;shift COMMAND=$1;shift for remote in $REMOTES do echo $remote ssh -oConnectTimeout=10 $remote $COMMAND done 

如果此脚本名为remote_command.sh ,则可以通过调用以下命令在远程计算机1-X上运行任何命令:

 remote_command "remote1 remote2 ... remote" "" > remote_command.log 

根据个人需要,我们可以从文件中读取$ REMOTES的列表,或者我们可以使用常规模式来指示遥控器的名称,以方便脚本使用。 如果远程客户端没有更改,我们也可以编写此脚本中的所有名称,仅使用该命令调用它。

* 不鼓励重新启用root帐户(通过在root shell中使用passwd root 定义root的有效密码)作为缺点。

它不是很便宜,也不是开源,但也许Canonical的景观可以提供帮助。

如果您正在使用自己的本地仓库(就像我认为您应该在学校工作以减少带宽需求),您可以根据所需软件的依赖性来制作。 然后每当你更新deb时,如果有一个安装更新cron作业,它以root身份运行或者任何神奇的事情发生。 每台PC都不需要大量的直接控制。 我会用包操作来做。 如果在deb中内置了“安装后任务”,您甚至可以通过这种方式推送一次性运行脚本。

我不知道任何可以做到这一点的互联网咖啡馆软件,我认为像Puppet或Chef这样的东西会有点过分。 您可以基于可以工作的SSH构建一个非常简单的设置。

假设您有20个客户端(10.0.0.101到10.0.0.120)和1个管理站(10.0.0.1)。

以下所有步骤最初只能在1个客户端上进行测试,以便进行测试。 需要在所有客户端上手动执行初始设置。

第1步:使其更安全(可选?)

在所有客户端上制定防火墙规则,仅接受来自10.0.0.1的新连接

也许你可以打开另一个关于此的问题。 我也可以提供iptables一些帮助,但我没有新的Ubuntu防火墙规则的经验。

第2步:建立连接

您需要在所有客户端上运行SSH服务。

  1. 在Management Station Station上创建单独的非root帐户。
  2. 运行ssh-keygen获取SSH密钥对。 不提供任何密码。
  3. 在客户端上创建单独的帐户。 Takkat提到了如何从Gnome登录窗口中排除它。
  4. 将帐户添加到sudoers(例如使用sudo visudo )。 添加此行:

    aptaccount1 ALL=(silktree) NOPASSWD: /usr/bin/apt-get

    NOPASSWD很重要,因为您需要安装才能运行而不要求您为每个客户端提供密码。

现在你可以测试了。 从您的管理工作站运行:

 ssh 10.0.0.101 sudo apt-get update 

第3步:并行连接所有

现在这里是我的贡献。我使用这个脚本大约3年,我真的很高兴。 它与许多节点并行运行ssh命令,很好地打印输出和/或错误。

您需要在管理站apt-get install ruby ,并将所有客户端主机放入/ etc / managed-clients列表中,如下所示:

 n01 n02 n03 n04 

并且还在管理站添加到/etc/hosts

 10.0.0.101 n01 10.0.0.102 n02 10.0.0.103 n03 10.0.0.103 n04 

然后将此脚本保存到/usr/local/bin/on-all-nodes-run

 #!/usr/bin/ruby CLIENTS_FILE = "/etc/managed-clients" require "open3" # Non-interactive, no password asking, and seasonable timeouts SSH_OPTIONS = ["-o PreferredAuthentications=publickey,hostbased,gssapi,gssapi-with-mic", "-o ForwardX11=no", "-o BatchMode=yes", "-o SetupTimeOut=5", "-o ServerAliveInterval=5", "-o ServerAliveCountMax=2" ].join(" ") SSH = "/usr/bin/ssh #{SSH_OPTIONS}" MKDIR = "/bin/mkdir" raise "Pleae give this command at least one argument" if ARGV.size < 1 COMMAND = ARGV[0..-1].join(' ') output_o = {} output_e = {} IO_CONNECTIONS_TO_REMOTE_PROCESSES = {} def on_all_nodes(&block) nodes = [] File.open(CLIENTS_FILE) do |f| while line = f.gets i = line.split(' ').first nodes.push(i) end end nodes.sort.each {|n| block.call(n)} end # Create processes on_all_nodes do |node| stdin, stdout, stderr = Open3.popen3("#{SSH} #{node} \"#{COMMAND}\"") IO_CONNECTIONS_TO_REMOTE_PROCESSES[node] = [stdin, stdout, stderr] end has_remote_errors = false # Collect results on_all_nodes do |node| stdin, stdout, stderr = IO_CONNECTIONS_TO_REMOTE_PROCESSES[node] stdin.close e_thread = Thread.new do while line = stderr.gets line.chomp! STDERR.puts "#{node} ERROR: #{line}" has_remote_errors = true end end o_thread = Thread.new do while line = stdout.gets line.chomp! puts "#{node} : #{line}" end end # Let the threads finish t1 = nil t2 = nil while [t1, t2].include? nil if t1.nil? t1 = e_thread.join(0.1) # Gives 1/10 of a second to STDERR end if t2.nil? t2 = o_thread.join(0.1) # Give 1/10 of a second to STDOUT end end end exit(1) if has_remote_errors 

该代码已经过审查,具有良好的编码风格,这里有一些截图: https : //codereview.stackexchange.com/questions/1180/ruby-script-on-all-nodes-run-for-teaching但我没有时间介绍这些建议。 代码运行良好。

测试如下:

 on-all-nodes-run echo hi n01 : hi n02 : hi n03 ERROR: Timeout, server not responding. n04 : hi 

第4步:并行安装软件

现在你应该可以安装和升级这样的软件了(对不起,我只有aptitude的show例子,但是应该可以用apt-get做同样apt-get ):

 on-all-nodes-run sudo aptitude show pbzip2 \| grep State n01 : State: not installed n02 : State: not installed n03 ERROR: Timeout, server not responding. n04 : State: not installed on-all-nodes-run echo "Yes" \| sudo apt-get install pbzip2 ... on-all-nodes-run sudo aptitude show pbzip2 \| grep State n01 : State: installed n02 : State: installed n03 ERROR: Timeout, server not responding. n04 : State: installed 

最后的说明

如果您有超过10-20个客户端,那么除了上面的脚本之外,您应该找到一种方法来重新配置像Perceus这样的硬盘驱动器。 这样你就可以节省一些时间(添加新的客户端等等)并确保所有客户端的所有内容都相同。 在实践中,我每年使用on-all-nodes-run 100次。 我每年都会与Perceus的所有客户重新塑造几次。