如何ssh到shell并运行脚本并让自己处于提示符下

时间:2014-06-17 06:16:07

标签: shell hadoop amazon-web-services ssh

我正在使用Amazon的弹性地图缩减。我正在进入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提示符下将其丢弃到hadoop主节点中。

2 个答案:

答案 0 :(得分:1)

考虑使用Expect,然后你可以在这些行上做一些事情并在最后interact

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

答案 1 :(得分:0)

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

  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呈现shell之前需要用户交互的一些程序存在问题。一些程序(如ssh)可以正常使用,其他程序(telnetvxsim)提示了一个提示,但没有文本传递给程序;只有像^C这样的ctrl字符。
  5. 执行以下操作:xterm -e 'commands; here; exec bash'。这将导致它在命令执行后创建交互式shell。
    • 只要用户在最后一个命令执行之前不尝试用^C中断,这就没问题了。
  6. 目前,我发现的唯一一件事就是我需要的行为是使用OpenWin项目中的cmdtool

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

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

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