【问题标题】:How to ssh into a shell and run a script and leave myself at the prompt如何通过 ssh 进入 shell 并运行脚本并将自己留在提示符下
【发布时间】:2014-08-07 01:20:19
【问题描述】:

我正在使用 Amazon 的 elastic map reduce。我正在进入 hadoop 主节点并执行类似的脚本。

$EMR_BIN/elastic-mapreduce --jobflow $JOBFLOW --ssh < hivescript.sh 。它让我进入主节点并运行配置单元脚本。 hivescript 包含以下几行

hive add jar joda-time-1.6.jar; add jar EmrHiveUtils-1.2.jar;

以及一些用于创建 hive 表的命令。该脚本运行良好并创建了配置单元表和其他所有内容,但返回到我运行脚本的提示符。如何在 hive 提示下将其 sshed 到 hadoop 主节点。

【问题讨论】:

  • 如果你想执行你的脚本并留在机器上,你为什么不在你的节点上ssh,然后运行你的脚本(而不是在一个命令中做同样的事情)?
  • 我正在自动化这个过程,父脚本将由一些最终用户运行,然后应该将其留在配置单元提示符处以执行一些查询。

标签: shell hadoop amazon-web-services ssh


【解决方案1】:

这些是我见过的最常见的答案(以及我遇到的缺点):

  1. 使用expect
    • 对于大多数人来说,这可能是最全面的解决方案
    • 我无法控制expect 是否安装在我的目标环境中
    • 只是为了尝试一下,我编写了一个简单的expect 脚本以通过 ssh 连接到远程机器,发送一个简单的命令,然后将控制权交给用户。在提示出现之前有很长的延迟,在摆弄它没有成功之后,我决定暂时继续前进。
    • 在意识到我违反了3 virtues of a good programmer 之一后,我最终回到了这个作为最终解决方案——虚假的不耐烦。
  2. 使用screen / tmux 启动shell,然后从外部进程注入命令。
    • 这工作正常,但如果终端窗口死掉它会留下一个screen/tmux 实例挂起。我当然可以尝试想出一种方法来重新附加到先前的实例或杀死它们; screen(可能还有tmux)可以让它死掉而不是自动分离,但我没有摆弄它。
  3. 如果使用gnome-terminal,请使用其-x--command 标志(我猜xterm 和其他人有类似的选项)
    • 我将详细介绍我在 #4 上遇到的问题
  4. 制作一个以#!/bin/bash --init-file为shebang的bash脚本;这将导致您的脚本执行,然后让交互式 shell 继续运行
    • 这和 #3 与一些程序存在问题,这些程序需要用户交互才能将 shell 呈现给它们。一些程序(如ssh)运行良好,其他程序(telnetvxsim)显示提示但没有文本传递给程序;只有 ^C 这样的 ctrl 字符。
  5. 执行如下操作:xterm -e 'commands; here; exec bash'。这将导致它在您的命令执行后创建一个交互式 shell。
    • 只要用户在最后一个命令执行之前不尝试使用^C 中断,就可以了。

目前,我发现唯一能提供所需行为的方法是使用 OpenWin 项目中的 cmdtool

/usr/openwin/bin/cmdtool -I 'commands; here'
# or
/usr/openwin/bin/cmdtool -I 'commands; here' /bin/bash --norc

生成的终端将通过-I 传递的命令列表注入到执行的程序中(没有参数表示默认shell),因此这些命令会显示在该shell 的历史记录中。

我不喜欢的是cmdtool 提供的终端感觉很笨重......但是唉。

【讨论】:

    【解决方案2】:

    考虑使用Expect,然后你可以按照这些思路做一些事情,最后interact

    /usr/bin/expect <<EOF
    spawn ssh ... YourHost
    expect "password"
    send "password\n"
    send javastuff 
    interact
    EOF
    

    【讨论】:

    • 我写了这个/usr/bin/expect &lt;&lt;EOF spawn $EMR_BIN/elastic-mapreduce --jobflow $JOBFLOW --ssh expect "hivescript:" send hivescript.sh interact EOF
    • 这是否意味着它对你来说没问题?如果是这样,请考虑通过单击计票旁边的空心勾号/复选标记来接受我的回答。如果没有,请说出哪里出了问题,以便我或其他人可以进一步帮助您。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多