Skip to content

Commit 22ae24b

Browse files
authored
Merge pull request #195 from tonycai653/master
重构,加入了过用户管理,命令自动补全,修改了一些小的命令行接口行为,比如如果没有指定文件,默认从标准输入读取内容
2 parents 3d6b077 + b168c48 commit 22ae24b

File tree

145 files changed

+6009
-11084
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

145 files changed

+6009
-11084
lines changed

.gitignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ bin
1111
# Architecture specific extensions/prefixes
1212
*.[568vq]
1313
[568vq].out
14-
14+
report.xml
1515
*.cgo1.go
1616
*.cgo2.c
1717
_cgo_defun.c
1818
_cgo_gotypes.go
1919
_cgo_export.*
20-
20+
.qshell
21+
qshell_
2122
_testmain.go
22-
2323
*.exe
2424
*.test
2525
*.prof

Dockerfile

Lines changed: 0 additions & 21 deletions
This file was deleted.

LICENSE

Lines changed: 0 additions & 22 deletions
This file was deleted.

Makefile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
WIN86=qshell_windows_x86.exe
2+
WIN64=qshell_windows_x64.exe
3+
DARWIN=qshell_darwin_x64
4+
LINUX86=qshell_linux_x86
5+
LINUX64=qshell_linux_x64
6+
7+
install:
8+
GOOS=darwin GOARCH=amd64 go build -o $(DARWIN) .
9+
cp ./$(DARWIN) /usr/local/bin/qshell && rm ./$(DARWIN)
10+
11+
all:
12+
GOOS=windows GOARCH=386 go build -o $(WIN86) .
13+
GOOS=windows GOARCH=amd64 go build -o $(WIN64) .
14+
GOOS=darwin GOARCH=amd64 go build -o $(DARWIN) .
15+
GOOS=linux GOARCH=386 go build -o $(LINUX86) .
16+
GOOS=linux GOARCH=amd64 go build -o $(LINUX64) .
17+
18+
linux:
19+
GOOS=linux GOARCH=386 go build -o $(LINUX86) .
20+
GOOS=linux GOARCH=amd64 go build -o $(LINUX64) .
21+
22+
windows:
23+
GOOS=windows GOARCH=386 go build -o $(WIN86) .
24+
GOOS=windows GOARCH=amd64 go build -o $(WIN64) .

README.md

Lines changed: 73 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44

55
qshell是利用[七牛文档上公开的API](http://developer.qiniu.com)实现的一个方便开发者测试和使用七牛API服务的命令行工具。该工具设计和开发的主要目的就是帮助开发者快速解决问题。目前该工具融合了七牛存储,CDN,以及其他的一些七牛服务中经常使用到的方法对应的便捷命令,比如b64decode,就是用来解码七牛的URL安全的Base64编码用的,所以这是一个面向开发者的工具,任何新的被认为适合加到该工具中的命令需求,都可以在[ISSUE列表](https://github.com/qiniu/qshell/issues)里面提出来,我们会尽快评估实现,以帮助大家更好地使用七牛服务。
66

7-
![qshell-quick-tour.gif](http://devtools.qiniu.com/qshell-quick-tour.gif)
8-
9-
107
## 下载
118

129
该工具使用Go语言编写而成,当然为了方便不熟悉Go或者急于使用工具来解决问题的开发者,我们提供了预先编译好的各主流操作系统平台的二进制文件供大家下载使用,由于平台的多样性,我们把这些二进制打包放到一个文件里面,请大家根据下面的说明各自选择合适的版本来使用。在文档中的例子里面,为了方便,我们统一使用`qshell`这个命令来做介绍。
@@ -15,20 +12,19 @@ qshell是利用[七牛文档上公开的API](http://developer.qiniu.com)实现
1512
1613
|版本 |支持平台|链接|
1714
|--------|---------|----|
18-
|qshell v2.2.0|Mac OSX, Linux, Windows|[下载](http://devtools.qiniu.com/qshell-v2.2.0.zip)|
15+
|qshell v2.2.1|Mac OSX, Linux, Windows|[下载](http://devtools.qiniu.com/qshell-v2.2.1.zip)|
1916

2017
## 安装
2118

2219
该工具由于是命令行工具,所以只需要从上面的下载之后即可使用。其中文件名和对应系统关系如下:
2320

2421
|文件名|描述|
2522
|-----|-----|
26-
|qshell-linux-x86 |Linux 32位系统|
27-
|qshell-linux-x64|Linux 64位系统|
28-
|qshell-linux-arm|Linux ARM CPU|
29-
|qshell-windows-x86.exe|Windows 32位系统|
30-
|qshell-windows-x64.exe|Windows 64位系统|
31-
|qshell-darwin-x64|Mac 64位系统,主流的系统|
23+
|qshell_linux_x86 |Linux 32位系统|
24+
|qshell_linux_x64|Linux 64位系统|
25+
|qshell_windows_x86.exe|Windows 32位系统|
26+
|qshell_windows_x64.exe|Windows 64位系统|
27+
|qshell_darwin_x64|Mac 64位系统,主流的系统|
3228

3329
**Linux和Mac平台**
3430

@@ -59,48 +55,56 @@ export PATH=$PATH:/home/jemy/tools
5955

6056
需要鉴权的命令都需要依赖七牛账号下的 `AccessKey``SecretKey`。所以这类命令运行之前,需要使用 `account` 命令来设置下 `AccessKey``SecretKey`
6157

62-
**单用户模式:**
63-
6458
```
65-
$ qshell account ak sk
59+
$ qshell account ak sk name
6660
```
6761

68-
**多用户模式:**
62+
其中name表示该账号的名称, 如果ak, sk, name首字母是"-", 需要使用如下的方式添加账号, 这样避免把该项识别成命令行选项:
6963

7064
```
71-
$ qshell -m account ak sk
65+
$ qshell account -- ak sk name
7266
```
7367

74-
## 多用户模式
68+
可以连续使用qshell account 添加账号ak, sk, name信息,qshell会保存这些账号的信息, 可以使用qshell user命令列举账号信息,在各个账号之间切换, 删除账号等
7569

76-
和其他的工具一样,本工具也会在使用的过程中,向本地磁盘写入一些文件,比如上面的`account`设置的 `AccessKey``SecretKey` 都是加密后保存在本地磁盘上的。另外还有`qupload``qdownload`功能也会向本地磁盘写入一些文件。
70+
## 账户管理
7771

78-
默认情况下,工具的使用模式是单用户模式,用户的所有信息写入到磁盘`$HOME_DIR/.qshell`下面。即如果你用`account`设置了新的密钥,那么这个新的密钥将覆盖旧的密钥。这个`$HOME_DIR`在Linux或者Mac下就是`~`所表示的目录。如果是Windows下则是`C:\Users\jemy`这样的路径。
72+
使用qshell user子命令可以用来管理记录的多账户信息。
73+
1. qshell user ls可以列举账户下所有的账户信息
74+
2. qshell user cu <userName>可以用来切换账户
75+
3. qshell user cu 不携带<userName>的话会切换到最近的上个账户;比如我在A账户做完操作后,使用qshell user cu B到了B 账户,那么使用qshell user cu可以切回到A账户.
7976

80-
但是有些情况下,我们可能拥有多个账号,比如同时拥有测试环境的账号和线上环境的账号,这种情况下,怎么让`qshell`同时支持多组`AccessKey``SecretKey`的设置呢?
77+
## 开启命令的自动补全
78+
**linux上,使用bash**
8179

82-
为了解决这个问题,我们引入了选项`-m`。当在使用`qshell`的时候,指定该选项的话,就会切换到多用户模式下,在这种模式下,工具会把所有的临时文件都写到工具执行的目录。
80+
在centos上,需要安装bash-completion包,默认该包没有安装
8381

84-
基于上面的功能,我们可以创建一些专用的目录,用来切换到`qshell`的多用户模式运行。假设本地有如目录`/Users/jemy/Temp/qshell/workdir`,这个目录下分别有`env_dev``env_prod`两种环境的账号。
82+
```
83+
$ yum install bash-completion -y
8584
86-
我们分别在目录`env_dev``env_prod`目录下,运行`qshell -m account ak sk`来设置不同账号的密钥对,结果如下:
85+
```
86+
87+
给当前的bash加入自动补全, 运行命令
8788

8889
```
89-
$ tree -a
90-
91-
├── env_dev
92-
│   └── .qshell
93-
│   └── account.json
94-
└── env_prod
95-
└── .qshell
96-
└── account.json
90+
$ source <(qshell completion bash)
91+
9792
```
9893

99-
这样其他的依赖`AccessKey``SecretKey`的命令都可以使用`-m`选项在这个目录下执行命令,例如`stat`获取文件信息:
94+
也可以把这个配置加入bash的启动文件中,这样到bash启动的时候,会自动加载qshell的补全配置:
95+
96+
97+
```
98+
$ echo "source <(qshell completion bash)" >> ~/.bashrc
99+
```
100+
101+
**Mac上,使用zsh**
102+
把如下代码加入zsh的启动文件中~/.zshrc
100103

101104
```
102-
$ cd /Users/jemy/Temp/qshell/workdir/env_dev
103-
$ qshell -m stat bucket key
105+
if [ $commands[qshell] ]; then
106+
source <(qshell completion zsh)
107+
fi
104108
```
105109

106110
## 命令选项
@@ -110,9 +114,42 @@ $ qshell -m stat bucket key
110114
|参数|描述|
111115
|----|----|
112116
|-d|设置是否输出DEBUG日志,如果指定这个选项,则输出DEBUG级别的日志|
113-
|-m|切换到多用户模式,这样所有的临时文件写入都在命令运行的目录下|
114117
|-h|打印命令列表帮助信息,遇到参数忘记的情况下,可以使用该命令|
115118
|-v|打印工具版本,反馈问题的时候,请提前告知工具对应版本号|
119+
|-C|qshell配置文件, 其配置格式请看下一节|
120+
121+
## 配置文件
122+
123+
1. 配置文件格式支持json, 如果需要使用配置文件,需要在家目录下创建文件名为.qshell.json的json文件
124+
2. 配置文件可以配置如io host, api host, rs hsot, rsf host, 这些如果没有指定,程序会自动选择
125+
126+
例子:
127+
128+
默认官方的列举空间的文件使用的是rs.qiniu.com域名,如果因为某种原因,比如私有存储,需要替换使用rs-test.qiniu.com这个域名的话,那么只需要
129+
在家目录下创建文件名字为.qshell.json的配置文件,文件内容为
130+
{
131+
"hosts": {
132+
"rs_host": "rs-test.qiniu.com"
133+
}
134+
}
135+
136+
如果想要更改io host为io-test.qiniu.com的话,只需要继续在上面的hosts中添加,如下:
137+
{
138+
"hosts": {
139+
"rs_host": "rs-test.qiniu.com",
140+
"io_host": "io-test.qiniu.com"
141+
}
142+
}
143+
144+
同理如果全部修改的话
145+
{
146+
"hosts": {
147+
"rs_host": "rs-test.qiniu.com",
148+
"io_host": "io-test.qiniu.com",
149+
"api_host": "",
150+
"rsf_host": ""
151+
}
152+
}
116153

117154

118155
## 命令列表
@@ -121,7 +158,8 @@ $ qshell -m stat bucket key
121158
|------|------------|----------|--------|
122159
|account|账号|设置或显示当前用户的`AccessKey``SecretKey`|[文档](docs/account.md)|
123160
|dircache|存储|输出本地指定路径下所有的文件列表|[文档](docs/dircache.md)|
124-
|listbucket/listbucket2|存储|列举七牛空间里面的所有文件|[文档](docs/listbucket.md)|
161+
|listbucket|存储|列举七牛空间里面的所有文件|[文档](docs/listbucket.md)|
162+
|listbucket2|存储|列举七牛空间里面的所有文件|[文档](docs/listbucket2.md)|
125163
|prefop|存储|查询七牛数据处理的结果|[文档](docs/prefop.md)|
126164
|fput|存储|以文件表单的方式上传一个文件|[文档](docs/fput.md)|
127165
|rput|存储|以分片上传的方式上传一个文件|[文档](docs/rput.md)|
@@ -169,36 +207,6 @@ $ qshell -m stat bucket key
169207
|unzip|工具|解压zip文件,支持UTF-8编码和GBK编码|[文档](docs/unzip.md)|
170208
|alilistbucket|第三方|列举阿里OSS空间里面的所有文件|[文档](docs/alilistbucket.md)|
171209

172-
## 项目编译
173-
174-
如果对项目编译感兴趣,请按照如下方式进行:
175-
176-
```
177-
$ go get github.com/astaxie/beego/logs
178-
$ go get github.com/fsnotify/fsnotify
179-
$ go get github.com/syndtr/goleveldb/leveldb
180-
$ go get github.com/yanunon/oss-go-api/oss
181-
$ go get golang.org/x/text/encoding/simplifiedchinese
182-
$ go get golang.org/x/sys/unix
183-
$ ./build.sh
184-
```
185-
186-
如果上面的 `golang.org/x` 下面的包因为被墙而无法下载,那么可以使用 `git clone` 分别将依赖的库下载到本地的`GOPATH`中:
187-
188-
```
189-
git clone https://github.com/golang/sys.git $GOPATH/src/golang.org/x/sys
190-
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
191-
```
192-
193-
对于跨平台的编译脚本 `cross-build-main.sh` 编译出来的二进制文件存在的已知问题如下:
194-
195-
[crontab下面引用qshell出错](https://github.com/qiniu/qshell/issues/68)
196-
197210
## 问题反馈
198211

199212
如果您有任何问题,请写在[ISSUE列表](https://github.com/qiniu/qshell/issues)里面,我们会尽快回复您。
200-
201-
## 技术讨论
202-
203-
如果您希望和在工作中使用`qshell`的其他人进行交流,可以加入QQ群:343822521 。
204-

cmd/account.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"github.com/qiniu/qshell/iqshell"
6+
"github.com/spf13/cobra"
7+
"os"
8+
)
9+
10+
func init() {
11+
RootCmd.AddCommand(cmdAccount)
12+
}
13+
14+
var cmdAccount = &cobra.Command{
15+
Use: "account [<AccessKey> <SecretKey> <Name>]",
16+
Short: "Get/Set AccessKey and SecretKey",
17+
Args: func(cmd *cobra.Command, args []string) error {
18+
if len(args) != 0 && len(args) != 3 {
19+
return fmt.Errorf("command account receives zero or three args, received %d\n", len(args))
20+
}
21+
return nil
22+
},
23+
Run: Account,
24+
}
25+
26+
func Account(cmd *cobra.Command, params []string) {
27+
if len(params) == 0 {
28+
account, gErr := iqshell.GetAccount()
29+
if gErr != nil {
30+
fmt.Println(gErr)
31+
os.Exit(iqshell.STATUS_ERROR)
32+
}
33+
fmt.Println(account.String())
34+
} else if len(params) == 3 {
35+
accessKey := params[0]
36+
secretKey := params[1]
37+
name := params[2]
38+
39+
pt, oldPath := iqshell.AccPath(), iqshell.OldAccPath()
40+
sErr := iqshell.SetAccount2(accessKey, secretKey, name, pt, oldPath)
41+
if sErr != nil {
42+
fmt.Println(sErr)
43+
os.Exit(iqshell.STATUS_ERROR)
44+
}
45+
}
46+
}

cmd/alilistbucket.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package cmd
2+
3+
import (
4+
"github.com/astaxie/beego/logs"
5+
"github.com/qiniu/qshell/iqshell"
6+
"github.com/spf13/cobra"
7+
)
8+
9+
var aliCmd = &cobra.Command{
10+
Use: "alilistbucket <DataCenter> <Bucket> <AccessKeyId> <AccesskeySecret> [Prefix] <ListBucketResultFile>",
11+
Short: "List all the file in the bucket of aliyun oss by prefix",
12+
Args: cobra.RangeArgs(5, 6),
13+
Run: AliListBucket,
14+
}
15+
16+
func init() {
17+
RootCmd.AddCommand(aliCmd)
18+
}
19+
20+
func AliListBucket(cmd *cobra.Command, params []string) {
21+
dataCenter := params[0]
22+
bucket := params[1]
23+
accessKeyId := params[2]
24+
accessKeySecret := params[3]
25+
listBucketResultFile := ""
26+
prefix := ""
27+
if len(params) == 6 {
28+
prefix = params[4]
29+
listBucketResultFile = params[5]
30+
} else {
31+
listBucketResultFile = params[4]
32+
}
33+
aliListBucket := iqshell.AliListBucket{
34+
DataCenter: dataCenter,
35+
Bucket: bucket,
36+
AccessKeyId: accessKeyId,
37+
AccessKeySecret: accessKeySecret,
38+
Prefix: prefix,
39+
}
40+
err := aliListBucket.ListBucket(listBucketResultFile)
41+
if err != nil {
42+
logs.Error("List bucket error,", err)
43+
return
44+
}
45+
logs.Info("List bucket done!")
46+
}

0 commit comments

Comments
 (0)