我正在使用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主节点中。
答案 0 :(得分:1)
考虑使用Expect,然后你可以在这些行上做一些事情并在最后interact
:
/usr/bin/expect <<EOF
spawn ssh ... YourHost
expect "password"
send "password\n"
send javastuff
interact
EOF
答案 1 :(得分:0)
这些是我见过的最常见的答案(我遇到过它们的缺点):
expect
expect
expect
脚本放到一个远程机器上ssh,发送一个简单的命令,然后将控制权交给用户。在提示出现之前有一段很长的延迟,在摆弄它之后没有成功,我决定暂时继续。screen
/ tmux
启动shell,然后从外部进程注入命令。
screen/tmux
实例。我当然可以尝试找到一种方法来重新连接到先前的实例或杀死它们; screen
(可能tmux
)可以使它死亡而不是自动分离,但我并没有摆弄它。gnome-terminal
,请使用其-x
或--command
标记(我猜是xterm
,其他人有类似选项)
#!/bin/bash --init-file
作为shebang的bash脚本;这将导致您的脚本执行,然后让交互式shell运行
ssh
)可以正常使用,其他程序(telnet
,vxsim
)提示了一个提示,但没有文本传递给程序;只有像^C
这样的ctrl字符。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
提供的感觉如此笨重...但是唉。