环境
案例基于下述环境参数进行编写和验证
Eclipse 2023-09 (4.29.0) 已经自动集成Ant环境
Eclipse 内置Ant 1.10.12
jsch-0.1.55
运行环境配置
Ant 1.10.* 适用于JDK 8及更高版本,Ant 1.9.* 适用于JDK 1.5及更高版本,Ant 1.8.* 适用于JDK 1.4及更高版本,Ant 1.7.* 适用于JDK 1.3及更高版本,Ant 1.6.* 适用于JDK 1.2及更高版本,Ant 1.2至Ant 1.5.* 适用于JDK 1.1及更高版本。
通过右键ant xml配置文件选择Run As
-> 2 Ant Build...
调整ant运行配置
检查jre版本
右键ant xml配置文件Run As
-> 2 Ant Build...
->JRE
-> Separate JRE
这里需要注意如果平时项目指定运行低版本的JDK,这里也会选中低版本JDK,需要手动修改成Eclipse默认Jre或额外指定高版本JDK
SSHEXEC Task
从 Since Apache Ant 1.6 开始可以使用 <sshexec>
任务实现远程用户通过SSH协议登录到系统中,并在远程系统上执行命令。该任务需要使用JSCh 0.1.29 [1]及以上版本
参数
属性 | 描述 | 必填的 |
---|---|---|
host | 远程主机的主机名或IP地址 | 是 |
username | 远程主机上的用户名 | 是 |
command | 在远程主机上运行的命令 | 必须填写command或commandResource,两者之一 |
commandResource | 要在远程主机上运行的命令的资源(适合多条指令的情况) | 必须填写command或commandResource,两者之一 |
port | 要连接到远程主机的端口号 | 否,默认22端口 |
trust | 如果设置为yes 或true,则信任所有未知主机。如果设置为false(默认值),则需要在knownhosts 文件中列出 |
否,默认false |
knownhosts | 设置用于验证远程主机身份的已知主机文件。这必须是 SSH2 格式的文件。不支持 SSH1 格式。 | 否,默认为${user.home}/.ssh/known_hosts |
failonerror | true 命令失败停止构建;false 则不停止构建 |
否,默认true |
password | 远程用户登录密码,这里建议用<input> 动态输入 |
是,除非使用基于密钥的身份验证或密码已在文件或todir属性中给出 |
keyfile | 私钥文件 | 如果使用密钥身份验证则必填 |
passphrase | 私钥的密码 | 否,默认空字符串 |
sshConfig | 保存OpenSSH风格配置的文件的位置(例如,${user.home}/.ssh/config)。除非已在任务参数中指定用户名和密钥文件,否则将从配置文件中读取。自Ant 1.10.8版本起适用。 | 否 |
suppresssystemout | 是否要阻止控制台输出,自 Ant 1.9.0 起可用[2] | 否 |
suppresssystemerr | 是否要阻止控制台错误输出,自 Ant 1.9.4 起可用 | 否 |
output | 输出写入到的文件的路径和名称 | 否 |
append | 是否在输出文件后附加内容 | 否,默认false |
errorOutput | 错误内容写入到的文件的路径和名称 | 否 |
errAppend | 是否在错误日志后附加内容 | 否,默认false |
outputproperty | 用于存储命令的输出结果的属性。如果使用了commandResource 属性,每个命令的输出将以该命令本身为前缀。[3] |
否 |
errorproperty | 用于存储命令标准错误输出的属性。自 Ant 1.9.4 起可用。[4] | 否 |
resultproperty | 返回码应该存储的属性。只有在 failonerror=false 时才有意义 [5] |
否 |
timeout | 如果命令在指定的时间内未完成(以毫秒为单位),则停止执行该命令 | 否,默认值为0,永久等待 |
input | 命令的输入数据,指定执行命令的标准输入来自哪个文件。该属性与inputstring 和inputproperty 属性互斥。当通过commandResource 执行多个命令时,每个命令都会读取输入。自 Ant 1.8.0 起可用。 |
否 |
verbose | 是否让sshexec 任务以详细模式输出给用户。类似于使用ssh命令行工具时加上-v选项所产生的输出。自Ant 1.8.0起可用。 |
否,默认false |
inputproperty | 命令的输入数据,输入属性的名称,其内容作为执行命令的输入流。该属性与input 和inputstring 属性互斥。当通过commandResource 执行多个命令时,每个命令都会读取输入。自 Ant 1.8.0 起可用。 |
|
inputstring | 命令的输入数据,“一个字符串,作为执行命令的输入流。该属性与input 和inputproperty 属性互斥。当通过commandResource 执行多个命令时,每个命令都会读取输入。自 Ant 1.8.3 起可用。 |
|
usepty | 是否分配一个伪终端(类似于使用 ssh -t 命令)。自 Ant 1.8.3 版本开始可用。[6] |
否,默认false |
useSystemIn | 是否将当前标准输入传递给远程进程。 自 Ant 1.9.4 起 | 否,默认false |
serverAliveIntervalSeconds | 设置超时时间间隔(以秒为单位)。如果在该时间内未从服务器接收到任何数据,任务将通过加密通道发送一条消息向服务器请求响应。自 Ant 1.9.7 起可用。 | 默认值是0,不会向服务器消息 |
serverAliveCountMax | 在没有从服务器收到任何响应消息的情况下,可以发送的服务器活动消息数量。只有在serverAliveIntervalSeconds 不为0时才会使用。自Ant 1.9.7版本起可用。 |
默认值是3 |
案例工程构建
使用Eclipse新建java工程 ant-sshexec
,在工程根目录下创建build.xml
配置文件
<?xml version="1.0"?>
<project basedir=".">
<echo message="${ant.version}"/>
</project>
如果eclipse能直接识别ant配置文件,则右键build.xml
配置文件会有Run As
-> 2 Ant Build...
选项,如果不能识别采用下述方法将build.xml
添加到Ant视窗控制台中,可在Ant 控制台中执行脚本
- 在Eclipse中打开Ant视图:
- 在Eclipse的底部面板或者菜单栏中选择 Window -> Show View -> Other。
- 在弹出的对话框中选择 Ant -> Ant。
- 添加Ant构建文件:
- 在Ant视图中右键单击空白处,选择“Add Buildfiles…”。
- 导航到项目中的
build.xml
文件并选择它。
- 运行Ant任务:
- 在Ant视图中,可以看到
build.xml
中定义的各种任务。 - 双击特定的任务运行它,或者右键单击任务并选择运行(Run)。
- 在Ant视图中,可以看到
配置SSHEXEC运行环境
- 下载jsch:
sshexec
依赖jsch,下载好后,放置到工程lib
目录下(没有该目录则手动新建,主要目的是方便Ant添加到Classpatch
)
- 添加jsch到Classpatch:
- 右键ant xml配置文件
Run As
->2 Ant Build...
->Classpath
->Add External JARs
选中jsch
所在路径即可
- 右键ant xml配置文件
command 参数
使用command参数来发送指令到远程服务
<?xml version="1.0"?>
<project basedir="." default="index">
<echo message="${ant.version}" />
<input message="请输入要执行target的名称" addproperty="targetName" />
<input message="请输入用户密码" addproperty="pwd" />
<target name="index">
<antcall target="${targetName}" />
</target>
<!-- 使用命令连接服务器后cd 到tmp目录下 ,并列出所有文件 -->
<target name="command">
<sshexec host="19.91.1.3" port="22" username="root" password="${pwd}" command="cd /tmp; ls;" trust="true" verbose="true" />
</target>
</project>
Run As
-> 1 Ant Build
输入对应target名称后,再输入远程服务器用户对应登录密码即可执行 command
中的指令,多条指令使用;
分割,xml
文件特殊字符需要转义,command="cd /tmp; ls;"
实际对应远程指令为 cd /tmp; ls;
commandResource 参数
使用commandResource
参数,将需要执行的脚本先写到文本中,commandResource
读取对应目录下的文件并执行脚本
1.在build.xml
同级目录下创建脚本文档commandResource.txt
cd /tmp; ls;
cd / ; ls;
2、编写target
读取脚本文件
<!-- 使用命令连接服务器后cd 到tmp目录下 ,并列出所有文件 -->
<target name="commandResource">
<sshexec host="19.91.1.3" port="22" username="root" password="${pwd}" commandResource="commandResource.txt" trust="true" verbose="true" />
</target>
每一行都会发送一条指令,上述脚本会分别发送两条指令:cd /tmp; ls;
和 cd / ; ls;
JSCh是一个纯Java实现的SSH2,可以让你连接到一个sshd服务器并使用端口转发,X11转发,文件传输等功能。 ↩︎
在Ant构建文件中,有时候执行任务时会生成输出到系统控制台。这个选项可以控制是否要隐藏或阻止这些输出信息,即不在控制台上显示执行任务所产生的输出。这在某些情况下可能很有用,比如当你希望任务默默地执行,不干扰控制台的输出。从Ant 1.9.0版本开始,这个选项就可以用来控制系统输出的显示与否。 ↩︎
在Ant构建文件中,某些任务(比如
<exec>
任务)允许执行外部命令,并且可以捕获这些命令的输出结果。这个属性提供了一个选项,可以将命令执行的输出存储到一个属性中,以便后续在构建过程中使用。
如果设置了outputproperty
属性,并且使用了commandResource
属性,那么每个执行的命令所产生的输出将被存储在指定的属性中。同时,输出的每一行可能会附带相应命令的前缀,这有助于区分不同命令输出的来源。 ↩︎在Ant构建文件中,有时候执行外部命令可能会产生错误输出(标准错误),这些错误信息可以被捕获并存储到一个属性中,以便后续在构建过程中进行处理。 ↩︎
当你执行某些命令时,可能会有一个返回状态,通常用于表示命令执行的成功或失败。
resultproperty
属性允许你捕获这个返回状态,并将其存储在指定的属性中。这个属性可以帮助你在构建过程中根据命令的执行结果采取不同的操作或者决策。 ↩︎在Ant构建文件中,当你使用
sshexec
任务执行远程SSH命令时,可能会需要分配一个伪终端(pseudo-tty)。伪终端允许命令交互式地与用户进行通信,这在某些情况下非常有用,特别是当需要输入密码或与远程终端交互时。 ↩︎
评论区