通过 ssh 连接到 Ubuntu 16.04 服务器后,如何在新终端中运行脚本(.sh)文件?

通过 ssh 连接到 Ubuntu 16.04 服务器后,如何在新终端中运行脚本(.sh)文件?

我尝试了很多方法,例如

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:

答案1

假设 Ubuntu 到 Ubuntu

如果你使用 Windows 10 桌面并想要连接到你的 ubuntu 服务器

一个简单的解决方案是根据以下链接在 Windows 中安装和使用 Putty,

www.putty.org/

PuTTY 是一个 SSH 和 telnet 客户端,最初由 Simon Tatham 为 Windows 平台开发。PuTTY 是一个开源软件,提供源代码,由一群志愿者开发和支持。

您可以下载PuTTY这里

您可以启动一个或多个Putty窗口并通过 运行不同的任务ssh


正如@SergiyKolodyazhnyy 的评论所述,您可以使用xrdp它来打开从 Windows 到 Ubuntu 的远程桌面会话。

正如@PerlDuck 的评论中所述,您可以在 Windows 中安装和使用 X 服务器,以便能够通过 运行图形应用程序ssh,但根据您的原始问题,这可能有点小题大做。

答案2

事情是这样的:terminatorgnome-terminal都是 GUI 应用程序。如果您的脚本不需要 GUI 并且是一个简单的 shell 脚本,那么您可以在 ssh 会话中顺利运行它,而无需终端仿真器。当然,您的脚本需要位于您尝试运行脚本的文件系统上。

如果出于某种原因你绝对需要terminatorgnome-terminal,你总是可以利用偏磷酸钠启动远程桌面会话。当然,前提是您要访问的 Ubuntu 系统有 X 服务器;例如,服务器计算机通常没有任何 GUI,因为这存在安全风险。

答案3

如果您确实需要,可以将需要 GUI 的应用程序从 SSH 会话运行到桌面会话中。我使用以下方法在需要时启动 VMWare 虚拟机,但我不在计算机前面。

我要强调的是,您提到您正在连接到 Ubuntu Server,默认情况下它没有安装桌面环境。在这种情况下,值得使用tmuxscreen,或将脚本推送到后台,或使用第二个 SSH 会话。如果桌面环境安装在服务器可以采取以下步骤。

以下脚本适用于 Ubuntu 16.04 的默认 Lightdm 和 Unity。


1.第一个要求是您的用户必须登录桌面会话。我使用以下脚本来实现这一点(来源和解释):

#!/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为可在整个系统范围内作为 shell 命令访问。别忘了使其可执行。


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为可在整个系统范围内作为 shell 命令访问。别忘了使其可执行。


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.参考文献和更多示例可在此处获得

相关内容