Gox语言中通过SSH远程执行命令及上传下载文件-GX10

Gox语言作为一个“粘合剂”语言,当然需要有便捷的网络编程能力和远程服务器操作的能力,没有让人失望的是,这确实也正是它所擅长的。


再次说明,Gox语言的安装很简单,只需要去官网下载单个的可执行文件或压缩包,加压到任意文件夹即可。当然放到Windows能够找到的路径下会方便以后执行,例如最简单的是直接放到C:\windows目录下。另外,Gox语言目前更新较频繁,随时注意下载最新版更新。



今天我们就来看看使用Gox语言如何方便地通过SSH协议远程操作云端的服务器,不但可以执行shell命令,还可以上传下载文件,而这些都可以通过Gox的脚本文件自动完成,无需手工参与,包括输入密码这些动作。


tk = import("tk")

// create a SSH client by host name(or IP address), port, user name and password
// remember to change the host name, user name and password to yours
clientT, errT = newSSHClient("example.com", 22, "root", "mypassword")

// if error occured, exit the program
checkError(errT, nil)

// defer function used for the following checkError functions
deferFunc = func() {
	clientT.Close()
}

// run "pwd" command on the remote server and get the output
cmdT = "pwd"

outT, errT = clientT.Run(cmdT)

checkError(errT, deferFunc)

pathT = tk.Trim(toString(outT))

pl("current path: %v", pathT)

// list the directory
outT, errT = clientT.Run(`ls -p`)

checkError(errT, deferFunc)

filesT = tk.SplitLines(tk.Trim(toString(outT)))

lenT = len(filesT)

dirCountT = 0

for v in filesT {
	if tk.EndsWith(v, "/") {
		dirCountT ++
	}
}

pl("%v\n", filesT)

pl("totally %v files, %v of them is directory", lenT, dirCountT)

// create a local file to uplaod
errStrT = tk.SaveStringToFile("*****test****", `./abc.txt`)

checkErrorString(errStrT, deferFunc)

// upload the local file
errT = clientT.Upload(`./abc.txt`, tk.Replace(tk.JoinPath(pathT, `abc.txt`), `\`, "/"))

checkError(errT, deferFunc)

// check if the upload process is successful 
outT, errT = clientT.Run(`ls -p; cat abc.txt`)

checkError(errT, deferFunc)

pl("files: \n%v", toString(outT))

// create a file on the remote server
clientT.Run(`echo "abc123" > down.txt`)

// download it to local current directory
errT = clientT.Download(`down.txt`, `./down.txt`)

checkError(errT, deferFunc)

// check and show the file content
println(systemCmd("dir"))

println("\nfile content: ", tk.LoadStringFromFile(`down.txt`))

// close the SSH client
clientT.Close()



照例我们先看看这段脚本的执行结果。


E:\scripts>gox ssh.gox
current path: /root
[b bh doc/ dysms/ dysms_python.zip go/ go1.10.2.linux-amd64.tar.gz go1.9.2.linux-amd64.tar.gz py/ sms/]

totally 10 files, 5 of them is directory
files:
abc.txt
b
bh
doc/
dysms/
dysms_python.zip
go/
go1.10.2.linux-amd64.tar.gz
go1.9.2.linux-amd64.tar.gz
py/
sms/
*****test****
Performance.java         dataTypes.gox       json.gox         test.js
abc.txt                  deep.gox            map.gox          test.tg
appenddictcompronun.gox  deepClone.gox       module.gox       testFunc.gox
array.gox                dict.gox            perf.cpp         testGUI.gox
awsIconFont.gox          down.txt            performance.go   testGUI_CN.gox
basic.gox                editFileCN.gox      performance.gox  testGUI_Mac.gox
basic.goxe               functionType.gox    performance.js   testLCL.gox
calculator.gox           generateImport.gox  performance.py   testTG.gox
calculatorGUI.gox        generategoxc.gox    performance.tg   testi.gox
calculatorLCL.gox        gox.go.w2d          ssh.gox          tmp.gox
commandLine.gox          hexToDec.gox        struct.gox
convertgovcl.gox         hexToInt.gox        test.ank
dataTypeConversion.gox   input.gox           test.gox

file content:  abc123


E:\scripts>

下面我们详细解说一下,首先说说这段代码究竟做了什么。

首先,调用内置的newSSHClient函数创建一个SSH连接(注意真要自用的话,需要把参数中的服务器域名或IP地址、端口号、用户名和密码都替换成自己服务器的),生成一个clientT对象,后面进行其他操作基本都是围绕这个对象来进行。

然后在服务器上用clientT的成员函数Run执行“pwd”命令以便获得服务器上当前目录,显然这多半是一个Linux服务器。

之后再用“ls -p”命令获取该目录下的文件列表,加上“-p”参数是为了区分出目录和文件,因为使用“-p”参数后,目录名后会带一个斜杠字符“/”。这样经过统计,程序计算出了该目录下的文件总数和目录数。

再然后在本地保存一个文本文件abc.txt,调用clientT.Upload函数上传到服务器的当前目录下,之后再验证该文件是否存在,并用cat命令显示其中的内容是否一致。

最后在服务器上创建一个down.txt文件并下载,同样地再验证其中的内容是否正确。

可以看到,我们完整地实现了在远程服务器上执行shell命令、上传和下载文件这一系列常见的服务器维护操作。

还需要补充说明几点:

  • 执行服务器命令时可以连续执行多条命令,把它们之间用分号字符“;”来分隔开就行,用“&&”分隔开也可以。
  • checkError和checkErrorString函数的作用是检查errT或errStrT等变量是否是错误或者错误字符串,如果是的话则中止程序的执行。它们的第二个参数可以传入一个函数,用于在程序中止前执行,类似于Go语言中的defer函数。
  • tk库中,有些函数返回的是error类型的返回值,有些则是返回TXERROR类型的字符串,需要参考说明来酌情使用checkError或checkErrorString;实际上tk.SaveStringToFile函数可以用tk.SaveStringToFileE函数,就也是返回error类型的值了。
  • deferFunc就是定义了一个defer函数,用于传递给checkError函数,在将要退出程序前保证将clientT正常关闭。
  • tk.SplitLines用于将多行的字符串拆分成字符串数组。
  • clientT.Upload和Download函数接收的参数,都可以是相对路径,也可以是绝对路径。
  • 由于本例测试时使用了Windows系统,所以将路径中的反斜杠一律替换为斜杠,以便与服务器上的系统一致。


总的来说,Gox语言用于通过SSH协议进行远程服务器操作,还是比较方便的,这也是Gox这种脚本语言追求的目标。

原文链接:,转发请注明来源!
「Gox语言中通过SSH远程执行命令及上传下载文件-GX10」评论列表

发表评论