单一管理员计算机,用于仅在网络上具有常规帐户的系
如何让系统只有一个具有由单台计算机管理的管理任务的常规帐户?
我只是希望能够在单个系统中的所有计算机上添加/删除软件。 批发 – 不单独登录每台计算机并执行需要完成的任务。 我可以通过物理或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服务。
- 在Management Station Station上创建单独的非root帐户。
- 运行
ssh-keygen
获取SSH密钥对。 不提供任何密码。 - 在客户端上创建单独的帐户。 Takkat提到了如何从Gnome登录窗口中排除它。
-
将帐户添加到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的所有客户重新塑造几次。