Как запустить файлы скриптов (.sh) в новом терминале после подключения к серверу Ubuntu 16.04 через ssh?

Я пробовал много способов, таких как

terminator -x abc.shПриведенная выше команда дает мне эту ошибку:

You need to run terminator in an X environment. Make sure $DISPLAY is properly set

Я тоже пробовал

gnome-terminal -x ./abc.sh

Приведенная выше команда дает мне ошибку ниже

Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Failed to parse arguments: Cannot open display:

3 ответа

Решение

Предполагая Ubuntu в Ubuntu

Если вы используете рабочий стол Windows 10 и хотите подключиться к вашему серверу Ubuntu

Простое решение - установить и использовать Putty в Windows по следующей ссылке:

https://www.putty.org/

PuTTY - это клиент SSH и telnet, изначально разработанный Саймоном Тэтхэмом для платформы Windows. PuTTY - это программное обеспечение с открытым исходным кодом, которое доступно с исходным кодом и разработано и поддерживается группой добровольцев.

Вы можете скачать PuTTY здесь.

Вы можете запустить одно или несколько окон Putty и запускать различные задачи через ssh,


Как описано в комментарии @SergiyKolodyazhnyy, вы можете использовать xrdp открыть сеанс удаленного рабочего стола из Windows в Ubuntu.

Как описано в комментарии @PerlDuck, вы можете установить и использовать X-сервер в Windows, чтобы иметь возможность запускать графические прикладные программы через ssh, но в соответствии с вашим первоначальным вопросом, это может быть излишним.

Вот в чем дело: terminator а также gnome-terminal являются приложениями GUI. Если ваш сценарий не требует графического интерфейса и является простым сценарием оболочки, то вы можете запустить его в своем сеансе ssh без проблем с эмулятором терминала. Конечно, ваш сценарий должен находиться в файловой системе, в которой вы пытаетесь запустить сценарий.

Если по какой-то причине вам абсолютно необходимо terminator или же gnome-terminal, вы всегда можете использовать xrdp для запуска сеанса удаленного рабочего стола. Это, конечно, если система Ubuntu, к которой вы пытаетесь получить доступ, имеет X-сервер вообще; серверные компьютеры, например, часто не имеют графического интерфейса, потому что это угроза безопасности.

Можно запустить приложение, которому требуется GUI из сеанса SSH, в сеанс Desktop, если вам это действительно нужно. Я использую следующий подход для запуска виртуальных машин VMWare, когда они мне нужны, но я не на передней панели компьютера.

Я хотел бы подчеркнуть, что вы упомянули, что вы подключаетесь к Ubuntu Server, на котором по умолчанию не установлена ​​среда рабочего стола. И в этом случае стоит использовать tmux или же screen или выдвиньте сценарий в фоновый режим, или используйте второй сеанс SSH. Если на сервере установлена ​​среда рабочего стола, можно выполнить следующие шаги.

Следующие скрипты работают с Lightdm и Unity, которые по умолчанию для Ubuntu 16.04.


1. Первое требование заключается в том, что ваш пользователь должен войти в систему в сеансе Desktop. Для этого я использую следующий скрипт ( источник и объяснения):

#!/bin/bash

# NAME: lightdm-auto-login

main() {
    # If the file '/etc/lightdm/lightdm.conf' exists create a backup copy
    [[ -f /etc/lightdm/lightdm.conf ]] && mv /etc/lightdm/lightdm.conf{,.bak}

    # Create autologin configuration for the current $USER = $1
    echo -e "[Seat:*]\nautologin-user=$1" > /etc/lightdm/lightdm.conf

    # Restart 'lightdm' while autologin option is enabled
    systemctl restart lightdm.service

    # Wait for a moment to complete the login process and remove the conf file
    sleep 30 && rm /etc/lightdm/lightdm.conf

    # Restore the backup if exists
    [[ -f /etc/lightdm/lightdm.conf.bak ]] && mv /etc/lightdm/lightdm.conf{.bak,}
}

# Execute the 'main()' function with root privileges in the background 'sudo -b'
# Pass the curent $USER as arg (https://unix.stackexchange.com/a/269080/201297)
sudo -b bash -c "$(declare -f main); main $USER"
  • Сценарий должен быть выполнен как обычный пользователь (принадлежит группе sudoers).

  • Я бы предпочел разместить сценарий в /usr/local/bin быть доступным для всей системы команд оболочки. Не забудьте сделать его исполняемым.


2. Во-вторых, несколько переменных среды (как $DISPLAY и т. д.) должны быть экспортированы из сеанса рабочего стола в сеанс SSH. Следующий скрипт сделает это, а также запустит команды, которые передаются как позиционные параметры ( источник и пояснения):

#!/bin/bash -e

# NAME: gui-launcher

# Check whether the user is logged-in
while [ -z "$(pgrep gnome-session -n -U $UID)" ]; do sleep 3; done

# Export the current desktop session environment variables
export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ")

# Execute the input command
nohup "$@" >/dev/null 2>&1 &

exit 0
  • Сценарий будет работать до тех пор, пока пользователь не войдет в систему, включая заблокированный экран.

  • Я бы предпочел разместить сценарий в /usr/local/bin быть доступным для всей системы команд оболочки. Не забудьте сделать его исполняемым.


3. Использование:

  • Установить сессию SSH;
  • казнить lightdm-auto-login;
  • казнить gui-launcher <commands or script> например:

    gui-launcher gnome-terminal -x bash -c "<my command or script>; exec bash"
    

    Обратите внимание на последнюю подкоманду exec bash будет держать запущенный gnome-terminal открыть после завершения предыдущей команды.


4. Демонстрация:


5. Ссылки и другие примеры:

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