Как узнать имя терминала linux

Как узнать, откуда берется имя терминала (приглашение командной строки)?

Когда я вхожу на удаленный сервер с моим user , я вижу имя терминала: user@someName . Я хочу изменить часть someName .

Я подумал, что это может быть связано с именем хоста. Итак, открыв /etc/hostname , он также получил имя someName . Но даже после изменения hostName имя терминала не изменилось (я попытался выйти из системы и войти обратно).

Также у этого пользователя нет созданного файла .bashrc .

2 ответа 2

В Linux имя компьютера хранится в трех разных местах: есть /etc /hostname, переменная $ HOSTNAME, используемая оболочкой, и в каком-то месте, куда X извлекает его, отличается от двух других. (Я нашел его однажды, несколько лет назад, но не помню, где я его нашел, за исключением того, что мне приходилось просматривать скрипты startx.)

Как вы сказали выше, изменение /etc /hostname недостаточно. Вам также необходимо изменить его в оболочке с помощью «hostname -F /etc /hostname». Или перезагрузите компьютер.

/etc/hostname будет читаться только во время загрузки, поэтому, если вы не перезагрузите хост, он не будет обновлять имя хоста машины.

Вы можете обновить имя хоста машины без перезагрузки, выполнив команду hostname , например так:

mtak@rubiks:~$ sudo hostname otherhostname mtak@rubiks:~$ bash mtak@otherhostname:~$ 

или прочитав файл /etc/hostname :

mtak@otherhostname:~$ less /etc/hostname rubiks mtak@otherhostname:~$ sudo hostname -F /etc/hostname mtak@otherhostname:~$ bash mtak@rubiks:~$ 

После изменения имени хоста, в любом случае, было бы неплохо перезагрузить хост, поскольку все работающие демоны, использующие имя хоста, не будут обновляться автоматически (например, Apache по-прежнему будет отображать сервер Apache/2.4.10 (Debian) на someName Port 80).

Источник

Как проверить, какой терминал я использую?

У меня есть Ubuntu на моей машине, и я использую замечательный оконный менеджер. Как проверить, какой терминал у меня запущен? Есть ли команда для этого?

TL; DR

  • найти текущее использование оболочки ls -l /proc/$$/exe
  • чтобы найти работающий терминал, используйте xprop _NET_WM_PID WM_CLASS . Значение pid позже может быть передано в ps -p -o args команду.
  • Технически, для эмулятора терминала вам даже не нужна команда, как указано в комментариях :
Читайте также:  User and group commands in linux

Шелл против Терминала

Первое, что нам нужно уточнить, это то, что именно спрашивают — выяснить, работает ли оболочка или работает терминал. Часто эти два термина взаимозаменяемы, но в целом это разные вещи. Оболочка — это интерпретатор командной строки, в частности, интерактивная оболочка — это текстовое поле для приглашения и ввода текста, в котором вы вводите команды. Оболочки также могут быть неинтерактивными, например, скрипт запускает неинтерактивную оболочку или bash -c ‘echo hello world’ также запускает неинтерактивную оболочку.

Напротив, терминал — это интерфейс к оболочке (хотя это может быть и другое приложение). Первоначально терминал относился к реальному оборудованию, но в настоящее время это в основном программное обеспечение. То, что вы видите, когда нажимаете Ctrl + Alt + t или щелкаете по значку терминала в графическом интерфейсе, это запускает эмулятор терминала, окно, которое имитирует поведение оборудования, и в этом окне вы можете видеть, как работает оболочка. Ctrl + Alt + F2 (или любая из 6 функциональных клавиш) откроет виртуальную консоль, иначе tty . Я рекомендую прочитать Почему виртуальный терминал «виртуальный», и что / почему / где «настоящий» терминал? для получения дополнительной информации о специфике.

Получение информации о оболочке

Каждому пользователю назначена оболочка по умолчанию /etc/passwd для его имени пользователя. Предполагая, что вы используете конфигурацию по умолчанию и еще не вызывали другую оболочку в качестве команды, достаточно сделать:

Но, конечно, это показывает только значение по умолчанию . Предположим, мы делаем следующее:

Мы изначально были в bash , но начали интерактивный сеанс /bin/dash , POSIX Ubuntu или системной оболочки . Переменная $SHELL не изменится, потому что это не ее цель — она ​​показывает значение по умолчанию, а не текущее значение. Нам нужно подойти к этому с другой точки зрения — с точки зрения процесса, о чем я уже говорил. Использую ли я bash или sh?

$ echo $$ 4824 $ cat /proc/4824/comm mksh $ bash xieerqi@eagle:~$ echo $$ 6197 xieerqi@eagle:~$ cat /proc/6197/comm bash 

Здесь мы используем преимущества /proc/ файловой системы. Имя процесса и параметры командной строки отображаются в /proc//comm . Все, что нам нужно, это предоставить PID оболочки, что и $$ делает. В приведенном выше примере я добавляю это отдельно, но ничто не мешает нам делать только

Читайте также:  Connection reset by peer in linux

Вариация на тему также может быть

Другой способ, которым мы могли бы подойти к этому, — проверить, где /proc//exe . Этот файл является символической ссылкой, указывающей на исполняемый файл. Таким образом, мы можем сделать

user@ubuntu:~$ ls -l /proc/$$/exe lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1241/exe -> /bin/bash user@ubuntu:~$ sh $ ls -l /proc/$$/exe lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1255/exe -> /bin/dash 

Любой из двух подходов работает в 99% случаев. Конечно, есть способы, которыми они могут быть подорваны. Например, символическая не будет указывать в любом месте , если исполняемый файл был удален сразу после запуска оболочки (и в этом случае вы , вероятно, возникнут проблемы системы, так как удаление /bin/sh , /bin/dash или даже /bin/bash не рекомендуется — ведь много сценариев полагаться на них особенно системного уровня). Имя команды для shell обычно задается как самый первый аргумент в execve() syscall. Это описано в разделе Как bash знает, как он вызывается? , так что если у вас есть приложение, которое запускает оболочку через него execve() , оно может дать ему любое имя. Но это нестандартные и нестандартные вещи, которых следует избегать ради последовательности и безопасности.

Получение информации о терминале

Мы можем начать с переменных среды. Многие терминалы, по-видимому, маскируют себя как xterm -совместимые, о чем сообщает echo $TERM или echo $COLORTERM . Но тогда переменные среды не очень надежный инструмент. Они могут быть установлены и не установлены. Мы можем сделать то же самое снова с PID, за исключением того, что на этот раз мы рассмотрим родительский PID. Как вы, возможно, помните, терминал является интерфейсом оболочки и часто запускает саму оболочку. Поэтому мы можем выяснить, какой процесс является родительским процессом нашей оболочки:

$ ps -p $$ -o args,ppid COMMAND PPID bash 1234 $ ps -p 1234 -o args COMMAND /usr/lib/gnome-terminal/gnome-terminal-server 

Давайте попробуем с другим терминальным приложением sakura :

$ ps -p $$ -o args,ppid COMMAND PPID /bin/bash 16950 $ ps -p 16950 -o args COMMAND sakura 

Оттуда мы уже можем видеть, что это начало этой оболочки gnome-terminal . Этот метод, конечно, работает, если вы работаете с интерактивной оболочкой. Если мы пытаемся выяснить родителя bash -c ‘. ‘ или оболочку, запущенную ssh , например, через PID, то вполне может быть, что нетерминальное приложение и, возможно, вообще не GUI.

Читайте также:  Основные команды администрирования linux

Поэтому, если мы хотим конкретно работать с терминалом с графическим интерфейсом, мы можем запустить его xprop , щелкнуть по нужному окну, grep его pid и узнать, как называется этот pid, соответствующий процессу. Или другими словами:

$ ps aux | grep $(xprop | awk -F'=' '/PID/ ') xieerqi 2124 0.6 1.7 208068 34604 ? Sl 18:47 1:49 gnome-terminal 

Кроме того, согласно спецификациям , оконные менеджеры должны установить WM_CLASS свойство. Таким образом, мы можем получить это и от xprop :

$ xprop WM_CLASS WM_CLASS(STRING) = "sakura", "Sakura" 

Конечно, это также имеет свой 1% недостатков: настройка WM_CLASS свойств зависит от того, как это делает оконный менеджер, и PID не гарантирует точности окна (см. Какой процесс создал это окно X11? ), Что может включать в себя сложную отладку. И это не недостатки самих методов, а сервера X11. Однако большинство стабильных и хорошо известных оконных менеджеров (таких как openbox, Metacity, blackbox) и большинство приложений хорошо себя ведут, поэтому не стоит ожидать проблем с чем-то вроде Gnome Terminal или Terminator.

Но когда дело доходит до эмуляторов терминала с графическим интерфейсом, нам даже не нужно искать команду. Мы можем просто использовать About диалог самого окна. Исключением из этого правила является xterm .

Источник

Оцените статью
Adblock
detector