У меня была такая же проблема, потому что у меня дисплей 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
внутри этих каталогов. Выберите псевдоним, который вам подходит.
Возможно, это несколько не по теме, но этого можно добиться с помощью 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)
Войдите через 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 часов дополнительного веб-сканирования я наконец-то это сделал! Большое спасибо @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()
Для менее серьезных проблем с безопасностью, чем установка пароля 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
только для чтения журналов.
Вы также можете использовать команду оболочки 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)
вы можете сделать это просто так в 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"
С уважением,