ssh войти в систему как пользователь и перейти на root, без sudo

У меня была такая же проблема, потому что у меня дисплей HiDPI. В моей системе (Arch) используется более крупный шрифт 12x24 , хотя на самом деле я использую 10x20 , потому что он выглядит лучше:

cssh -f 10x20 ...

Их можно найти в / usr / share / fonts / misc / font.alias . Согласно , это , font.alias - это файлы, которые сопоставляют удобные для человека файлы, такие как 10x20 , в компьютерные файлы, такие как -misc-fixed-medium-r -нормальный - 20-200-75-75-c-100-iso8859-1 .

Получите список каталогов шрифтов с помощью команды xset q и найдите font.alias внутри этих каталогов. Выберите псевдоним, который вам подходит.

2
09.04.2018, 10:18
6 ответов

Возможно, это несколько не по теме, но этого можно добиться с помощью Python и модуля paramiko :

.
#!/usr/bin/python2
import time
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('127.0.0.1', port=22, username='user', password='pass')

stdin, stdout, stderr = ssh.exec_command('su')
time.sleep(0.1) # some enviroment maybe need this.
stdin.write('root_password_goes_here\n')

[ add extra code here to execute a command ]

stdin.flush()
print (stdout.readlines())
ssh.close()

Следует отметить, что хранение паролей в сценарии обычно является плохой идеей с точки зрения безопасности. Убедитесь, что у вас установлены правильные разрешения для сценария (, например. чмод 740)

3
27.01.2020, 21:53

Войдите через SSH (как непривилегированный пользователь ), затем выполните команду suбез каких-либо аргументов, чтобы измениться на пользователя root. Для этого вам понадобится пароль root. Затем запустите любые команды, которые вы хотите запустить.
РЕДАКТИРОВАТЬ:Если вы хотите сделать это в одну строку, вы можете использовать следующее:
ssh username@hostname "su -c \"code_here\""
Если это не сработает, убедитесь, что пароль root включен, запустив passwdот имени root. Это попросит вас ввести новый пароль root.
Дополнительно:Для запуска команды от имени другого пользователя, кроме root (Обратите внимание, что для этого требуется пароль целевого пользователя):
ssh username@hostname "su - username_of_target -c \"code_here\""

4
27.01.2020, 21:53

Итак, после 4 часов дополнительного веб-сканирования я наконец-то это сделал! Большое спасибо @jeroen -it -nerdbox за понимание этого:

Задача состояла в том, чтобы получить данные из smartctl (, для которого требуются учетные данные root ), с сервера с отключенным ssh -root и отключенным sudo. Это, конечно, также будет работать с sudo вместо su.

вот полный рабочий код на Python с реализацией Paramiko.

#!/usr/bin/python2

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('rootserver.domain.com', port=22, username='admin', password='adminpass')

stdin, stdout, stderr = ssh.exec_command('/bin/su root -c "smartctl -a /dev/sda > /tmp/smartctl_output"', get_pty=True)
stdin.write('rootpass\n')

stdin.flush()
print (stdout.readlines())
ssh.close()
0
27.01.2020, 21:53

Для менее серьезных проблем с безопасностью, чем установка пароля root в сценарии, вы можете использовать исполняемый файл setuid.

setuidисполняемые файлы запускаются от имени пользователя root, независимо от того, какой пользователь их запускает.

Основное преимущество этого заключается в том, что если кто-то украдет ваш ноутбук, он сможет работать smartctl -a /dev/sdaкак root, но в остальном имеет только ваши привилегии пользователя. Или даже меньше,если вы настроили открытый ключ с помощью принудительной команды, как упоминалось позже.

Напишите простую программу на C, smartctl_wrapper.c, которая просто запускает нужный вам сценарий или программу, например:

#include <unistd.h>

int main() {
    //depending on your use case, you may want 
    //setuid(0), setgid(0), and/or setegid(0) here
    execl("/full/path/to/smartctl","smartctl","-a","/dev/sda",(char*) NULL);
}

И скомпилируйте его как gcc smartctl_wrapper.c -o smartctl_wrapper.

Затем вы делаете это принадлежащим root и группе, которая должна иметь возможность запускать его. Эти команды следует запускать от имени пользователя root :

.
chown root:some_group smartctl_wrapper

Затем сделайте его setuidисполняемым файлом. Также запретите любому пользователю редактировать его:

chmod 4510 smartctl_wrapper

Теперь это исполняемый файл, который может запускать любой член some_groupс правами суперпользователя без запроса пароля.

Теперь вы можете просто запустить его по ssh:

ssh user@server.domain /path/to/smartctl_wrapper

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

Если сервер не разрешает это, вы можете вместо этого создать скрипт с паролем ssh. В этом случае я настоятельно рекомендую вам создать нового пользователя только для этого с минимальными разрешениями и оболочкой входа /sbin/nologin.

В качестве альтернативы, для вашего конкретного случая использования может иметь смысл полностью избегать запуска команд от имени пользователя root поверх ssh. Например, вы можете запланировать периодическое выполнение этой команды, используя cron. Вы можете редактировать crontab root с помощью:

su -c crontab -e -u root

и добавляем строку:

5 0 * * sun smartctl -a /dev/sda >> /some/path/to/log/some/non/root/user/can/read

Указанная строка будет запускать команду один раз в неделю, через 5 минут после полуночи в воскресенье. Вы можете настроить это по своему вкусу, следуя указаниям в crontab (5).

Затем вы можете использовать sshтолько для чтения журналов.

1
27.01.2020, 21:53

Вы также можете использовать команду оболочки paramiko для интерактивного сеанса.https://www.youtube.com/watch?v=lLKdxIu3-A4

import paramiko
from paramiko.channel import Channel
import time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ip', port=22, username='non-root', password='non-root-password')

channel:Channel = ssh.invoke_shell()
print(type(channel))
channel_data = str()

while True:
   if channel.recv_ready():
       time.sleep(2)
       channel_data += str(channel.recv(999))
   else:
       continue

   channel.send("whoami\n")
   time.sleep(2)
   channel_data += str(channel.recv(999))

   channel.send("su\n")
   time.sleep(5)
   channel_data += str(channel.recv(999))

   # if "Password" in channel_data:
   channel.send("rootpaasword\n")
   time.sleep(2)
   channel_data += str(channel.recv(999))

   channel.send("whoami\n")
   time.sleep(2)
   channel_data += str(channel.recv(999))

   # channel_data += str(channel.recv(999))
   break


print(channel_data)
2
27.01.2020, 21:53

вы можете сделать это просто так в bash :, который имитирует человеческое взаимодействие с su. Я использую его в своих автоматических удаленных установщиках для серверов, на которых нет sudo.

sucmd="sh -c 'sleep 3; echo $pass' | script -qc 'su -c./yourscript.sh root '"

ssh -t -l "$user" "$ipaddress" -p 22 "$sucmd"

С уважением,

0
27.01.2020, 21:53

Теги

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