Shellinabox与Ipmitool

Shellinabox简介

Openstack的Ironic组件中有一个部分提供了shellinabox来调用ipmitool以实现访问机器的console的功能

通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和Putty等。但是,有可能我们在防火墙后面不能使用这些工具访问远程系统,或者防火墙只允许HTTPS流量才能通过。不用担心!即使你在这样的防火墙后面,我们依然有办法来访问你的远程系统。而且,你不需要安装任何类似于OpenSSH或Putty的通讯工具。你只需要有一个支持JavaScript和CSS的现代浏览器,并且你不用安装任何插件或第三方应用软件。

这个shellinabox,发音是Shell In A Box,是由Markus Gutschke开发的一款自由开源的基于Web的Ajax的终端模拟器。它使用AJAX技术,通过Web浏览器提供了类似原生的 Shell 的外观和感受。

Ironic中的实现

ironic.drivers.modules.ipmitool.py中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class IPMIShellinaboxConsole(base.ConsoleInterface)
def start_console
...
ipmi_cmd = ("/:%(uid)s:%(gid)s:HOME:ipmitool -H %(address)s"
" -I lanplus -U %(user)s -f %(pwfile)s"
% {'uid': os.getuid(),
'gid': os.getgid(),
'address': driver_info['address'],
'user': driver_info['username'],
'pwfile': pw_file})

for name, option in BRIDGING_OPTIONS:
if driver_info[name] is not None:
ipmi_cmd = " ".join([ipmi_cmd,
option, driver_info[name]])

if CONF.debug:
ipmi_cmd += " -v"
ipmi_cmd += " sol activate"
try:
console_utils.start_shellinabox_console(driver_info['uuid'],
driver_info['port'],
ipmi_cmd)
...

ironic.drivers.modules.console_utils.py中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def start_shellinabox_console(node_uuid, port, console_cmd):

...
# put together the command and arguments for invoking the console
args = []
args.append(CONF.console.terminal)
if CONF.console.terminal_cert_dir:
args.append("-c")
args.append(CONF.console.terminal_cert_dir)
else:
args.append("-t")
args.append("-p")
args.append(str(port))
args.append("--background=%s" % pid_file)
args.append("-s")
args.append(console_cmd)
...

这里的CONF.console.terminal就是shellinabox

安装shellinabox

Centos上安装shellinabox,可以使用yum安装与源码编译安装,使用yum安装需要先打上epelrepo

1
2
sudo yum install -y http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum install -y shellinabox

编译安装的话源码地址在此(需越墙):

1
2
3
4
5
6
wget https://shellinabox.googlecode.com/files/shellinabox-2.14.tar.gz
tar xf shellinabox-2.14.tar.gz
cd shellinabox-2.14
./configure --prefix=/usr/local/shellinabox
make && make install
ln -s /usr/local/shellinabox/bin/shellinaboxd /usr/bin/

使用shellinabox

常用参数为-b-t-s

1
2
3
-b, --background[=PIDFILE]  run in background
-t, --disable-ssl disable transparent SSL support
-s, --service=SERVICE define one or more services

这里主要说下-s参数,这个参数的意思相当于给这个服务注册应用地址。-s参数的详细说明:

1
2
3
4
5
6
7
One or more --service arguments define services that should be made available
through the web interface:
SERVICE := <url-path> ':' APP
APP := 'LOGIN' | 'SSH' [ : <host> ] | USER ':' CWD ':' CMD
USER := 'AUTH' | <username> ':' <groupname>
CWD := 'HOME' | <dir>
CMD := 'SHELL' | <cmdline>

举例说明

1
shellinaboxd -b -t -s /:LOGIN -s /date:nobody:nogroup:/:date

这表示当前这个shellinabox服务有两个调用地址,一个是根目录/,另一个是/date。调用/时,返回的是登录页面;调用/date时,返回的是在shell里执行date的结果。


如果在登录页面不能登录,参考以下解决方法:

由此结合ironic可以得到shellinabox调用ipmitool获取console的大致命令:

1
2
shellinaboxd -b -t -s /:LOGIN \
-s /ipmitool/get_console:nobody:nogroup:/:"ipmitool -I lanplus -U <username> -H <hostname> -P <password> sol activate"

当访问http://localhost:4200/ipmitool/get_console时即可获取到console,其他的功能也可以通过编写新的service添加到shellinabox服务中。

更多详细资料