Как запустить файлы скриптов (.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
Если вы установили соответствующее программное обеспечение на сервере, вы можете войти в систему удаленно
ssh -X
а затем запустить графические прикладные программы, такие какterminator
а такжеgnome-terminal
, Смотрите эту ссылку,Вы также можете просто запустить другие окна терминала локально, и в эти окна войти удаленно
ssh
и таким образом запустить несколько приложений текстового режима на сервере (каждая в своем собственном окне терминала).
Если вы используете рабочий стол Windows 10 и хотите подключиться к вашему серверу Ubuntu
Простое решение - установить и использовать Putty в Windows по следующей ссылке:
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. Ссылки и другие примеры: