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

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

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

b1a12593fb2d0c48a9d9fd407a66accf.png

今天我们就来看看使用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 yoursclientT, errT = newSSHClient("example.com", 22, "root", "mypassword")// if error occured, exit the programcheckError(errT, nil)// defer function used for the following checkError functionsdeferFunc = func() {clientT.Close()}// run "pwd" command on the remote server and get the outputcmdT = "pwd"outT, errT = clientT.Run(cmdT)checkError(errT, deferFunc)pathT = tk.Trim(toString(outT))pl("current path: %v", pathT)// list the directoryoutT, errT = clientT.Run(`ls -p`)checkError(errT, deferFunc)filesT = tk.SplitLines(tk.Trim(toString(outT)))lenT = len(filesT)dirCountT = 0for v in filesT {if tk.EndsWith(v, "/") {dirCountT ++}}pl("%v", filesT)pl("totally %v files, %v of them is directory", lenT, dirCountT)// create a local file to uplaoderrStrT = tk.SaveStringToFile("*****test****", `./abc.txt`)checkErrorString(errStrT, deferFunc)// upload the local fileerrT = 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: %v", toString(outT))// create a file on the remote serverclientT.Run(`echo "abc123" > down.txt`)// download it to local current directoryerrT = clientT.Download(`down.txt`, `./down.txt`)checkError(errT, deferFunc)// check and show the file contentprintln(systemCmd("dir"))println("file content: ", tk.LoadStringFromFile(`down.txt`))// close the SSH clientclientT.Close()

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

E:scripts>gox ssh.goxcurrent 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 directoryfiles:abc.txtbbhdoc/dysms/dysms_python.zipgo/go1.10.2.linux-amd64.tar.gzgo1.9.2.linux-amd64.tar.gzpy/sms/*****test****Performance.java         dataTypes.gox       json.gox         test.jsabc.txt                  deep.gox            map.gox          test.tgappenddictcompronun.gox  deepClone.gox       module.gox       testFunc.goxarray.gox                dict.gox            perf.cpp         testGUI.goxawsIconFont.gox          down.txt            performance.go   testGUI_CN.goxbasic.gox                editFileCN.gox      performance.gox  testGUI_Mac.goxbasic.goxe               functionType.gox    performance.js   testLCL.goxcalculator.gox           generateImport.gox  performance.py   testTG.goxcalculatorGUI.gox        generategoxc.gox    performance.tg   testi.goxcalculatorLCL.gox        gox.go.w2d          ssh.gox          tmp.goxcommandLine.gox          hexToDec.gox        struct.goxconvertgovcl.gox         hexToInt.gox        test.ankdataTypeConversion.gox   input.gox           test.goxfile content:  abc123E: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这种脚本语言追求的目标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值