bash 脚本中的退出案例后 SSH 退出

bash 脚本中的退出案例后 SSH 退出

所以我有以下标准脚本:

    #!/bin/bash
    PS3='Please enter your choice: '
    options=("option 1" "Option 2" "Option 3" "Quit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Option 1")
                echo "you chose choice 1"
                ;;
            "Option 2")
                echo "you chose choice 2"
                ;;
            "Option 3")
                echo "you chose choice 3"
                ;;
            "Quit")
                break
                ;;
            *) echo invalid option;;
        esac
    done

但是当我通过 SSH 运行脚本并选择“退出”选项时,SSH 也会退出。什么可能导致问题?我只想退出脚本并继续在 SSH 中工作。

问题出在我下面讨论的 .bash_aliases 文件中。我被放在exec剧本之前。当我删除它并运行命令时,一切正常。

答案1

根据您所描述的行为,听起来您正在像这样运行脚本:

$ ssh remote picker.bash

例子

当我ssh进入远程系统时,它会按预期工作,主要是脚本完成后我会保留在远程服务器上。

假设我有两台电脑,分别是远程电脑和笔记本电脑。我们将使用“L”表示lappy,使用“R”表示remotey。

L$ ssh remotey

R$ ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4

R$

ssh但是,如果我像这样运行脚本,我会得到您描述的终端消失的行为:

L$ ssh remotey ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4

L$

答案2

您可以从选项 4 启动子 shell,但是当我使用“exec /bin/bash --login”尝试时,子 shell 的提示符丢失,导致远程 shell 有点难以使用。

ssh 的手册页似乎建议您可以运行 shell Xor 命令,但不能同时运行两者:

概要 ssh [许多选项] [用户@]主机名 [命令] ...

如果指定了 command,则它将在远程主机上执行,而不是在登录 shell 上执行。

...

当服务器接受用户的身份时,服务器要么执行给定的命令,要么登录到计算机并在远程计算机上为用户提供正常的 shell。

...

当远程计算机上的命令或 shell 退出时,会话终止

答案3

如果您运行,ssh remotehost somescript那么脚本就会运行,仅此而已。如果不指定远程命令,您只能获得交互式 shell:交互式 shell 是默认的远程命令。当脚本退出时,远程会话结束。

如果您想在脚本之后运行交互式 shell,请告诉 SSH 您需要两者。添加该-t选项,以便您在远程主机上获得终端:默认情况下,SSH 仅在您告诉它运行交互式 shell 时创建终端,而不是在您指定命令时创建终端。

ssh -t remotehost '/path/to/script; exec bash'

请注意,脚本中定义的任何环境变量将不可用。如果需要,请改为在远程 shell 中获取脚本。这还允许您从脚本关闭会话:exit在脚本中不仅会退出脚本,还会退出整个远程会话,因为所有会话都在一个 shell 内运行。

ssh -t remotehost '. /path/to/script; exec bash'

答案4

问题出在 bash_aliases 中。我必须exec在脚本之前删除。现在 bash_aliases 文件如下所示:

command="/path/to/script.sh"

exec会导致 SSH 退出会话。

相关内容