需求
有时候,需要运行一个大的 xxx.sh
脚本,或者运行一条很长的命令,不便于记忆,可以利用 alias 取别名
例子:shell实现SSH自动登陆
每次登陆自己开发机总要输入 ssh user_name@192.00.00.xx
,然后再确认输入password
,手快了还经常会输错。作为一个懒人,肯定要找一个取巧的方式,编写一个shell 脚本,令其自动登陆
0. 安装 expect
1. 完成脚本
以下是一个完成版的脚本 test.sh
:
注:如果注释报错的话就去掉
#!/usr/bin/expect # 指定shebang
set timeout 3 # 设定超时时间为3秒
spawn ssh user_name@192.***.***.*** # fork一个子进程执行ssh命令
expect "*password*" # 期待匹配到 'user_name@ip_string's password:'
send "my_password\r" # 向命令行输入密码并回车
# send "sudo -s\r" # 切换到 root 权限
# send "cd /data/logs\r" # 帮我切换到常用的工作目录
interact # 允许用户与命令行交互
2. 添加权限
如果运行 ./test.sh
,报错
Terminal error: zsh: permission denied: ./startup.sh
则说明没有对文件添加权限
- 执行
sudo chmod +x ./test.sh
命令给shell脚本添加执行权限; - 将权限限制为单个访问类,可以使用:
chmod u+x ./test.sh
再次运行 ./test.sh
命令,一键登陆成功!
3. alias别名
脚本完成了,可是还是有些小瑕疵:
输入 ./file_name.sh
命令太长。。。
只能在脚本目录中才能执行,不然使用绝对路径输出的命令更长。
这里我们想到了linux的alias命令:
alias命令:
- 终端命令行输入
alias
,即可看到当前所有的别名 - alias命令使用方式为
alias alias_name="ori_command"
,将 alias_name 设置为 ori_command 的别名,这样我们输入执行 alias_name,就相当于执行了ori_command;
可是,我们会发现,当你关闭当前shell后,再打开一个shell窗口,再使用alias_name,系统提示command not found;
有没有能保持命令的方式呢?编辑bash_profile
文件。
bash_profile文件
我们编辑bash_profile文件,此文件会在终端窗口创建的时候首先执行一次,所以可以帮我们再设置一次别名;
执行命令vim ~./bash_profile
,在文件内部添加:
alias alias_name="/root_dir/../test.sh
保存后,再使用 . ~./bash_profile
或source ~./bash_profile
在当前脚本执行一遍设置别名命令,完成设置;
这样,我们无论在哪个目录,只要输入alias_name
命令,回车,真正的一键登陆!
zshrc 文件
如果是 mac 较新的版本,其终端为 zsh,其配置在以下文件中
vim ~/.zshrc
而后一样在文件中添加
alias alias_name="/root_dir/../test.sh
最后
source ~/.zshrc