Не существует полезного экрана для этого действия, возможно, есть инструмент для него, но нет никакого виджета или экранлета
В каждой системе требуется хотя бы один административный пользователь, потому что в Ubuntu отключена отдельная учетная запись root *. Тем не менее можно было бы скрыть этого пользователя «администратор» из логина gdm, добавив следующую строку в /etc/gdm/custom.conf:
[greeter]
Exclude=nobody,administrator
. Мы также можем ограничить доступ для чтения пользователей, не являющихся администраторами, к /home/administrator/ ,
Для административных задач мы регистрируемся локально в качестве администратора пользователя (например, в командной строке или путем выбора других в GUI) или удаленно через ssh.
Для выдачи команды нескольким удаленным машинам нам нужно определить локальный файл конфигурации в ~/.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
Дополнительные параметры могут потребоваться для дальнейшего управления сведениями о сеансе (например, отключение аутентификации пароля).
Теперь мы напишем сценарий, который соединяется одному клиенту за другим выполнить заданную команду:
#!/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, вызвав: [!d13 ]
remote_command "remote1 remote2 ... remote<X>" "<COMMAND>" > remote_command.log
В зависимости от индивидуальных потребностей мы могли прочитать список из $ REMOTES из файла, или мы могли бы использовать обычный шаблон для имен пультов для удобного использования скриптов. Если удаленные клиенты не изменяются, мы также можем закодировать все имена в этом скрипте, чтобы вызывать его только с помощью команды.
* Повторное включение учетной записи root (путем определения допустимого пароля для root с passwd root <password> в корневая оболочка) обескураживается, поскольку недостатки перевешиваются.
Это не совсем дешево, ни с открытым исходным кодом, но, возможно, Canonical's Landscape может помочь.
Если вы используете свое собственное местное репо (например, я думаю, что если вы работаете в школе, чтобы сократить требования к пропускной способности), вы можете просто сделать deb с зависимостями программного обеспечения, которое вы хотите. Затем всякий раз, когда вы обновляете deb, если есть задание cron для установки обновлений, которое запускается как root или что-то волшебное. Вам не нужно большое количество прямого управления на каждом ПК. Я бы сделал это с манипуляциями с пакетами. Вы можете даже нажать одноразовые сценарии запуска таким образом, если у вас есть «задача после установки», встроенная в deb.
Я не знаю никакого программного обеспечения интернет-кафе, которое бы это сделало, и я думаю, что что-то вроде кукольного или шеф-повара будет излишним. Вы можете создать очень простую настройку на основе SSH, которая будет работать.
Допустим, у вас есть 20 клиентов (10.0.0.101 - 10.0.0.120) и 1 станция управления (10.0.0.1).
Все следующие шаги могут быть протестированы изначально на одном клиенте только для проверки.
Сделать правило брандмауэра для всех клиентов только для всех клиентов. принять новые соединения из 10.0.0.1
Возможно, вы можете открыть другой вопрос об этом. Я также могу оказать некоторую помощь с iptables, но у меня нет опыта работы с новыми правилами брандмауэра Ubuntu.
Вам нужно будет иметь Служба SSH работает на всех клиентах.
Создайте отдельную учетную запись без полномочий 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 лет и am действительно доволен этим. Он выполняет команду ssh параллельно со многими узлами, печатающими выходные и / или ошибки.
Вам нужно будет установить ruby на станции управления 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- для обучения, но у меня не было времени, чтобы представить эти предложения.
Протестируйте следующим образом:
on-all-nodes-run echo hi
n01 : hi
n02 : hi
n03 ERROR: Timeout, server not responding.
n04 : hi
Теперь вы должны иметь возможность устанавливать и (извините, у меня есть только пример show с aptitude, но с 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