Единый компьютер администратора для систем с обычной учетной записью в сети

Не существует полезного экрана для этого действия, возможно, есть инструмент для него, но нет никакого виджета или экранлета

1
задан 5 June 2015 в 23:24

4 ответа

Скрыть администраторов

В каждой системе требуется хотя бы один административный пользователь, потому что в Ubuntu отключена отдельная учетная запись root *. Тем не менее можно было бы скрыть этого пользователя «администратор» из логина gdm, добавив следующую строку в /etc/gdm/custom.conf:

[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

Дополнительные параметры могут потребоваться для дальнейшего управления сведениями о сеансе (например, отключение аутентификации пароля).

Выполнить команду для нескольких клиентов

Теперь мы напишем сценарий, который соединяется одному клиенту за другим выполнить заданную команду:

#!/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> в корневая оболочка) обескураживается, поскольку недостатки перевешиваются.

5
ответ дан 25 May 2018 в 21:10
  • 1
    Разве вы не имеете в виду /home/users/? Для SSH есть что-то, что можно настроить на пользовательских компьютерах, которые я описал? И как я могу отправлять команды на несколько компьютеров навалом? – Oxwivi 11 May 2011 в 08:48
  • 2
    У вас будет, например, /home/jack/ и /home/oxwivi/ в ваших боксах. Джек может (или не может!) Нуждаться в дополнительных ограничениях доступа к /home/oxvivi. Помимо запуска сценария запуска или cronjob для доступа к сценарию административной задачи, который будет размещен на вашем сервере администратора, я не знаю, как отправлять команды ssh в несколько ящиков (для ssh вам нужно удаленно войти в систему). Я не очень люблю сетевиков, но может быть и более элегантное решение. Новый Q, если этого не задавали раньше? – Takkat 11 May 2011 в 11:30

Это не совсем дешево, ни с открытым исходным кодом, но, возможно, Canonical's Landscape может помочь.

3
ответ дан 25 May 2018 в 21:10
  • 1
    Я знаю об этом, но я не могу рекомендовать его школе, которая использовала пиратскую Windows ... (деятельность LoCo) – Oxwivi 13 May 2011 в 15:01

Если вы используете свое собственное местное репо (например, я думаю, что если вы работаете в школе, чтобы сократить требования к пропускной способности), вы можете просто сделать deb с зависимостями программного обеспечения, которое вы хотите. Затем всякий раз, когда вы обновляете deb, если есть задание cron для установки обновлений, которое запускается как root или что-то волшебное. Вам не нужно большое количество прямого управления на каждом ПК. Я бы сделал это с манипуляциями с пакетами. Вы можете даже нажать одноразовые сценарии запуска таким образом, если у вас есть «задача после установки», встроенная в deb.

3
ответ дан 25 May 2018 в 21:10

Я не знаю никакого программного обеспечения интернет-кафе, которое бы это сделало, и я думаю, что что-то вроде кукольного или шеф-повара будет излишним. Вы можете создать очень простую настройку на основе SSH, которая будет работать.

Допустим, у вас есть 20 клиентов (10.0.0.101 - 10.0.0.120) и 1 станция управления (10.0.0.1).

Все следующие шаги могут быть протестированы изначально на одном клиенте только для проверки.

Шаг 1: Сделать его более безопасным (необязательно?)

Сделать правило брандмауэра для всех клиентов только для всех клиентов. принять новые соединения из 10.0.0.1

Возможно, вы можете открыть другой вопрос об этом. Я также могу оказать некоторую помощь с iptables, но у меня нет опыта работы с новыми правилами брандмауэра Ubuntu.

Шаг 2: Установите соединение

Вам нужно будет иметь Служба 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: Соединитесь со всеми параллельно

Теперь вот где мой вклад входит. Я использовал этот скрипт около 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

Шаг 4: Установите программное обеспечение параллельно

Теперь вы должны иметь возможность устанавливать и (извините, у меня есть только пример 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

Заключительная записка

[d28 ] Если у вас более 10-20 клиентов, то в дополнение к вышеприведенному сценарию вы должны найти способ переустановки жестких дисков с помощью чего-то вроде https://codereview.stackexchange.com/questions/1180/ рубиново-скрипт-на-все-узлы запустить обмен на преподавание . Таким образом, вы можете сэкономить некоторое время (добавив новый клиент и т. Д.) И убедитесь, что все одинаково для всех клиентов. На практике я использую on-all-nodes-run 100 раз в год. Я повторно переписываю с Персеем всех клиентов несколько раз в год.

3
ответ дан 25 May 2018 в 21:10
  • 1
    Вместо echo "Yes" \| sudo apt-get install pbzip2 используйте sudo apt-get -y install pbzip2. В противном случае вы можете отвечать и «Да». на вопрос типа «вы хотите, чтобы я нарушил вашу систему?». ;) – Lekensteyn 18 May 2011 в 23:56
  • 2
    @Lekensteyn +1 хорошая точка. Я также рекомендую ssh'ing на одного из клиентов и через одну установку вручную, чтобы вы знали, какие ответы вы хотите. И только тогда все это будет проверено на всех клиентах. На практике это не очень большая сделка. – Aleksandr Levchuk 19 May 2011 в 00:02
  • 3
    Почему марионетка, шеф-повар и т. Д. Будут излишними? Они могут включать в себя кривую обучения для настройки, но они обеспечивают гораздо больше, чем просто выполнение команды на нескольких машинах. Как ваш скрипт справится с задачей настройки новой установки и т. Д.? – Egil 19 May 2011 в 14:23

Другие вопросы по тегам:

Похожие вопросы: