首页 > 代码库 > BSA NShell系列-nexec命令
BSA NShell系列-nexec命令
# nexec
## 1 说明:nexec是远程命令接口引擎
nexec [-?] [-t term] [-o] [-i] [-l] [-nohup hostname "cmd &"] -e | hostname cmd [args]
如果你不想看下面的臭又长,可以直接看下面示例:
## 2 nexec常用示例
1 在指定主机执行命令
cloudexpress# nexec 10.200.108.92 net user
2 在当前路径所在的主机执行命令执行命令
cloudexpress# cd //10.200.108.92
10# pwd
//10.200.108.92/c/
10# nexec -e ifconfig
3 在指定主机上以后台方式执行命令或程序 (适用于需要很多环境变量依赖的情况)
cloudexpress# nexec -nohup 10.200.108.92 "ipconfig &"
4 运行脚本示例
windows上:
nexec 10.200.108.92 cmd /c "c:\startup.bat"
Linux上:
nexec -u -l 10.200.108.92 su - root -c "sh /etc/startup.sh"
其实上面这两个例子也是nexec <host> <command>格式,可以根据实际情况进行变换,比如要后台运行脚本则:
nexec -u -l -nohup 10.200.108.92 su - root -c "sh /etc/startup.sh &"
例子看完了,够用就走开吧
## 3 描述
nexec有两种工作方式
1 显示方式
语法: *nexec ARG1 ARG2*
第一个参数可以是被执行命令的主机、或者是-e,如果是-e则意味着在当前工作目录所在的主机执行命令。第二个参数就是要远程执行的命令和命令的参数
例如:nexec 10.200.108.92 tasklist /FI "IMAGENAME eq tasklist.exe" 等价于 cd //10.200.108.92;nexec 10.200.108.92 tasklist /FI "IMAGENAME eq tasklist.exe"
2 隐式方式
被执行的命令已经软连接到nexec,则执行该命令时是隐式方式。执行时,系统自动把要执行的命令<command>解释为nexec <host> <command>执行,其中host由当前程序的工作目录所在的主机所决定。注意:要执行的命令必须是remote_cmds 配置文件中声明过的,否则系统默认在localhost上执行,结果是错误的。怎么定制remote_cmds,请参见以前写的"BSA NShell系列-NSH命令"文章。
## 4 命令参数
-e 在当前远程主机执行命令
-i 通知agent以纯交互模式运行,用于一些需要交互的程序(如Solaris /bin/vi 或者AIX的smit)。如果使用这个选项,标准输出和标准错误的消息都将一起显示。不用这个选项,则远程的标准输出和标准错误将写入各自本地的标准输出和标准错误中。仅当远程机的交互式程序无法正常显示时使用这个选项。
-l 模拟一个login shell。该选项尝试启动一个远程程序模拟实际的登录会话。它会根据远程权限设置HOME、LOGNAME、USER环境变量的值。它将初始工作目录设置为有效远程用户的home目录。然后使用有效远程用户的默认shell调用*cmd args* ,并设置执行程序(有效远程用户的默认shell)的 *argv[0]* 为"-"。这是一种被各种shell(如sh,ksh,bash等)理解的表明当前shell是login shell的方法,并以login shell的方式执行初始化脚本(如.profile等)。最终该选项会在 *utmp* 数据库中创建一条记录。utmp数据库的记录可以通过 *who* 命令查看。
注意:该选项仅适用用于远程服务器是类Unix机器,此外,并非所有平台都支持*utmp*。如果*cmd*是在有效远程用户的默认shell执行的,那么nexec将直接执行command而非再次派生新的shell执行。
下面例子阐明了命令是如何执行的(假定默认shell是/bin/ksh)。
Client sends ’nexec -l -e ls -la’
Agent executes ’/bin/ksh -ksh -c "ls -la"
Client sends ’nexec -l -e ksh’
Agent executes ’/bin/ksh -ksh’
-n 忽略标准输入(不从标准输入中读取任何数据)。默认地,nexec会把所有输入的数据发送给远程命令作为标准输入。使用该选项则不再读取标准输入,因此该选项仅用于不需要输入的命令。
-nohup Hostname "cmd &"
在服务器后台执行一个命令,该选项适用于7.0.3及以上版本的agent。
-o 使用旧版本的nexec协议。Release7.0为nexec协议引入了一些同步补丁,使用该选项告诉nexec不使用这些同步补丁。
-r 不对input/output进行自动转码,详细信息参见(国际化问题)节。
-u 使用该选项nexec将把所有命令的输出(stdout/stderr)从目标服务器的本地代码页转换为UTF8。它假定输出是由正确的代码页序列组成,所以随机二进制数可能无法正确转换、无效的and/or 未识别的序列将转换为问号‘?‘。
-t term 告知nexec忽略 *TERM variable* 的值,并使用 *term* 替代terminal type。
当在windows机器执行**nexec**命令时,命令不能是交互命令,必须是batch(output only)command。
## 5 国际化问题
其中一个问题是,当用户跨多个服务器执行时,这些机器如何在混合的代码页环境中进行有意义的交互。
比如:一个window服务器设置的区域是Japanese、代码页(code page)是CP932,另一台Solaris服务器设置的区域也是Japanese、但代码页是EUC-JP。这时从windows机器上通过nexec在Solaris机器执行命令产生了Japanese输出。这时显示在windows机器上的输出是错误的,是因为windows机器期待CP932的代码序列,但Solaris提供的却是EUC-JP的代码序列。所以输出的结果可能不怎么有用。
为了处理这个问题,nexec现在默认自动进行转码。命令的输出在正常情况下,先在nexec客户端转换为本地代码页,然后显示到到终端/屏幕前。而现在命令产生的输出会先被agent抓取并自动转换为UTF-8,然后再发送给nexec客户端,最终显示在终端上。同样的,nexec抓取的输入(stdin)在发送给agent前也被转换为UTF-8。
由于这个自动转码可能不总是满足需要,使用-r选项会使所有数据设为raw模式,也就是不自动转码。
需要注意是否有转码问题,未识别的字符会被问号‘?‘替代。如果不想自动转码,可以使用 *-r* (raw)选项禁用该功能。
## 6 X11 Forwarding
nexec工具通过以下方式自动配置agent抓取X11 流量:
重置**DISPLAY**变量并通过隧道方式把流量转发到发起nexec调用的服务器。这允许你的通过隧道方式安全的转发X11流量,这和其他NSH工具安全功能相同。
## 7 nexec默认支持的命令
Network Shell提供如下预配置的命令:
arp、finger、ifconfig、ipconfig (NT)、mem (NT)、mount、nbtstat (NT)、net (NT)、netstat、nfsstat、ps、size、swap、umount、uptime、who、xterm
## 8 警告
不同操作系统的命令可能不一致,某个参数选项可能在不同平台表现也不统一。比如 *ps* 命令的例子,在BSD、ATT系统的参数选项完全不同。当然某些命令可能在一些主机上也不能用。
由于nexec命令不支持图形界面交互,所以windows平台只支持简单的输入输出命令/程序,需要控制台界面操作的程序会挂起或者功能异常。
## 9 作者
nexec是由Thomas Kraus写的
BSA NShell系列-nexec命令