使用 ssh 执行远程服务器内联命令

使用 ssh 执行远程服务器内联命令

我正在尝试创建一个连接到远程服务器并执行更新的脚本,但我想确保当时没有人在使用该计算机,因此我执行“ps”命令来查看进程,然后提示如果安装应该继续。这是我试图制作的代码:

ssh -T root@$machine <<- 'END'
    #Show the non-root processes
    ps -ef | grep -v root

    #Prompt if should continue (this doesn't work)
    echo "Continuar a instalação? [y/n]"
    select valor in y n
    do
        case $REPLY in
            y )
                echo "Digitado y"
                break
                ;;
            n )
                echo "Digitado n"
                exit
                ;;
        esac
    done

    #Test if it's working
    echo "Test"
END

当我执行此代码时,我得到以下行为:

Continuar a instalação? [y/n]
1) y
2) n
#? 1) y
2) n
#? #? 1) y
2) n
#? #? 
#? 1) y
2) n
#? #? #? 1) y
2) n
#? #? #? #?

然后脚本关闭。我尝试使用 -t -t 选项运行 ssh 但仍然遇到同样的问题。我缺少什么?

答案1

select当您将脚本放在 上时,您无法与远程进程 ( ) 通信stdin。当你的输入结束时,你会遇到这样的情况:select从你的文件中读取一些垃圾stdin,然后读取 EOF。

您应该使用将文件复制到服务器scp,然后运行它。

答案2

我决定将命令分成两个 ssh 连接,一个用于列出进程,另一个用于更新,在它们中间提示继续:

ssh -T root@$machine <<- 'END1'
    ps -ef | grep -v root | grep -v lightdm
END1

echo "Continuar a instalação? [y/n]"
select valor in y n
do
    case $REPLY in
        y )
            break
            ;;
        n )
            exit
            ;;
    esac
done

ssh -T root@$machine <<- 'END2'
    printf "Test\n"
END2

问题是它会要求你输入 ssh 连接的密码两次。

相关内容