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

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

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

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

// create a SSH client by host name(or IP address), port, user name and password
clientT, errT = tk.NewSSHClient("example.com", 22, "root", "mypassword")

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

// ensure close the client
defer clientT.Close()

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

outT, errT = clientT.Run(cmdT)

checkError(errT)

pathT = tk.Trim(string(outT))

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

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

checkError(errT)

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

lenT = len(filesT)

dirCountT = 0

for _, v = range 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)

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

checkError(errT)

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

checkError(errT)

pl("files: \n%v", string(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)

// check and show the file content
println(tk.SystemCmd("dir"))

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




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

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这种脚本语言追求的目标。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容