{"id":14965339,"url":"https://github.com/sjqzhang/ops_channel","last_synced_at":"2025-06-18T12:38:13.487Z","repository":{"id":57449336,"uuid":"156169984","full_name":"sjqzhang/ops_channel","owner":"sjqzhang","description":"命令通道是联接人与机器，人与业务的一座桥.它跟常用的开源运维工具(`ansible`,`saltstack`,`puppet`)有相似之处，但也有着本质的差异。","archived":false,"fork":false,"pushed_at":"2024-09-21T22:11:44.000Z","size":10224,"stargazers_count":39,"open_issues_count":1,"forks_count":14,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-15T09:07:40.622Z","etag":null,"topics":["aiops","ansible","channel","devops","puppet","remote-control","remote-shell","saltstack","ssh"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sjqzhang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-05T06:19:36.000Z","updated_at":"2025-02-19T07:39:04.000Z","dependencies_parsed_at":"2024-09-22T20:01:36.044Z","dependency_job_id":"d319e176-b33a-4e74-948a-b18d8d70d024","html_url":"https://github.com/sjqzhang/ops_channel","commit_stats":{"total_commits":52,"total_committers":3,"mean_commits":"17.333333333333332","dds":"0.42307692307692313","last_synced_commit":"65e7a37fcccf06a50fcaf9c65adc90ff00169ddd"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fops_channel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fops_channel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fops_channel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fops_channel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sjqzhang","download_url":"https://codeload.github.com/sjqzhang/ops_channel/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245078181,"owners_count":20557280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiops","ansible","channel","devops","puppet","remote-control","remote-shell","saltstack","ssh"],"created_at":"2024-09-24T13:34:36.686Z","updated_at":"2025-03-23T09:10:34.191Z","avatar_url":"https://github.com/sjqzhang.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[视频教程](https://www.bilibili.com/video/av82624198?p=6)\n[![一睹为快](https://asciinema.org/a/258501.svg)](https://asciinema.org/a/258501)\n\n## 什么是命令通道？\n命令通道是联接人与机器，人与业务的一座桥.它跟常用的开源工具(`ansible`,`saltstack`,`puppet`)有相似之处，但也有着本质的差异。\n## 命令通道有那些特点？\n命令通道简单，高效，安全，可靠，可扩展．\n- 简单：只有一个可执行文件，无需第三方依赖，安装(服务端，客户端)只需一条命令．客户端零配置．\n- 高效: 每秒可以操纵上千台服务器．\n- 安全：每个\n人员使用不同的token+ip的黑白名单．\n- 可靠：自动修复，过载保护\n- 可扩展：可以简单配置实现集群，支持10w+客户端\n- 支持执行实时消息\n\n## 稳定性如何？\n本工具已经在线上稳定运行2年，管理机器超1Ｗ+,无出现重大问题．\n\n\n\n## 硬件要求？\n```\n客户端千级别以下，4核8g\n客户端万级别以下，8核16g\n```\n\n\n## 如何安装命令通道\n\n### 安装服务端\n```\nmkdir -p /opt/channel\nwget --no-check-certificate https://github.com/sjqzhang/ops_channel/releases/download/v1.0/CliServer  -O /opt/channel/CliServer \u0026\u0026 cd /opt/channel/ \u0026\u0026 chmod +x CliServer \u0026\u0026 ./CliServer \u0026\n```\n\n### Docker部署服务端(建议）\n```\nDIR=/mnt \u0026\u0026 mkdir -p $DIR/{cache,conf,doc,files,log} \u0026\u0026  docker run -d  --net=host --name channel -v $DIR/files:/opt/channel/files -v $DIR/conf:/opt/channel/conf  -v  $DIR/cache:/opt/channel/cache  -v  $DIR/doc:/opt/channel/doc   -v  $DIR/log:/opt/channel/log  sjqzhang/ops_channel\n```\n```\n注意:DIR=/mnt 其中/mnt为宿主机的路径,将宿主机的目录挂载到容器\n```\n\n### 安装客户端\n```\nwget  http://{serverip}:9160/cli/upgrade -O /bin/cli \u0026\u0026 chmod +x /bin/cli \u0026\u0026 cli daemon -s restart\n```\n\n### 单独安装cli命令行(无服务端)\n```\nwget  https://raw.githubusercontent.com/sjqzhang/ops_channel/master/cli -O /bin/cli \u0026\u0026 chmod +x /bin/cli \n```\n\n\n\n### 简单使用(`服务端执行`)\n```\ncli cmd --token abc -u root --sudo 1 -c hostname -i ip{客户端ip}\n```\n\n\n\n\n## cli客户端命令\n\n### 登陆相关\n```\ncli login -u username -p password #用户名密码登陆\ncli logout #登出\ncli register -u username -p password #注册用户 \ncli enableuser -u username #启用用户\ncli disableuser -u username #禁用用户\n```\n\n### shell相关\n```\necho hello | cli len  ##字符串长度 数据长度等    \necho hello | cli upper  ##字符串转大写   \necho HELLO | cli lower  ##字符串转小写  \necho 'hello,world' |cli split -s ',' ##字符串分隔\necho 'hello,world' |cli split -s ','|cli join -s ' '　##数组并接  \necho 'hello,world' |cli split -s ','|cli jq -k 0 |cli join 　##数组并接 \necho 'hello,world' |cli match -m '[\\w+]+$' -o aim　##字符正则匹配 -o aim (i:ignoresencase,a:all,m:mutiline) \necho 'hello,world' |cli cut -p 5:-1  ##字符串截取\necho '{\"name\":\"hello\",\"date\":\"2018-11-09\"}'|cli jq -k name  ##json解析器\ncli md5 -s 'hello'　##字符md5\ncli md5 -f filename ##文件md5\ncli uuid ##随机uuid\ncli rand ##随机数\ncli randint -r 100:1000 ##100-1000随机数\ncli randstr -l 20 ##随机数字符串\ncli machine_id  ##客户端编号\n```\n\n### 状态相关\n```\ncli status\ncli run_status\ncli check_status\ncli info\ncli check -i ip(客户端ip)\ncli repair -i ip(客户端ip)\n```\n\n\n### 文件相关\n```\ncli upload -f filename ##文件上传(需登陆)\ncli delfile -f filename ##文件上传(需登陆)\ncli listfile -d directory ##查看文件\n```\n\n\n\n### 执行命令\n```\ncli register -u username -p password  #注册用户\ncli addtoken -t token -u user -s sudo -b blackip -w whiteip  #增加token认证\ncli rshell -u username --sudo 0 --token token -i ip -d directory -f filename -a arguments -o json --async 1　-t timeout #远程执行\ncli cmd -u username --sudo 0 --token token -c command -i ip -o json --async 1 -t timeout #执行命令\n参数说明：\n-i ip(在那个ip上运行指令，多个ip用英文逗号分隔)\n-u username(执行的用户)\n--sudo 0(0:普通用户，1:root执行)\n-t timeout(超时时间,单位秒，默认：25S)\n-o json/text(结果输出格式,默认：text)\n--async 0(是否使用异步执行，1:异步,0:同步)\n--token token(授权token)\n```\n\n\n\n### http api\n```python\n###远程执行命令\n# -*- coding: utf-8 -*-\nimport requests\nimport json\nimport time\nimport threading\nimport random\ndef cmd(ip,cmd):\n    param={\n        'c':cmd, #command\n        'i':ip, #ip\n        'u':'root',# user\n        'o':'json',# return json or text\n        'sudo':'1', # sudo\n    }\n    headers={'token':'abc'}\n    data={'param':json.dumps(param)}\n    return requests.post('http://server ip:9160/cli/api',data=data,headers=headers).text\n\nprint cmd('client ip','hostname')\n\n\n\n\n###远程执行脚本\n\n# -*- coding: utf-8 -*-\nimport requests\nimport json\nimport time\nimport threading\nimport random\ndef cmd(ip,filename,args):\n    param={\n        'd':'apollo', #command\n        'f':filename, #filename (注意：这个文件先要登陆上传后才能使用）\n        'a':args,# user\n        'u':'root',# user\n        'o':'json',# return json or text\n        'sudo':'1', # sudo\n    }\n    headers={'token':'abc'}\n    data={'param':json.dumps(param)}\n    return requests.post('http://server ip:9160/cli/rshell',data=data,headers=headers).text\n\nprint cmd('client ip','test.sh','{\"name\":\"test\"}')\n\n```\n\n\n\n\n\n\n## Q\u0026A\n\n### cli　客户端可以单独使用么？\n```\n可以单独使用,可以当shell的一个命令来使用,通过组合功能非常强大！\n```\n[视频教程](https://www.bilibili.com/video/av82624198?p=6)\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjqzhang%2Fops_channel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsjqzhang%2Fops_channel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjqzhang%2Fops_channel/lists"}