赞
踩
我之前也是在windows上用mobaxterm的,确实是非常非常好用。转到mac之后,一度也寻找类似mobaxterm软件,后来我发现配置用了iterm 和 ssh config 之后基本打消了这个念头,因为更丝滑了。
ssh config是怎么做呢?在~/.ssh目录下面新建config文件, 配置好别名:
- Host *
- Port 22
- ServerAliveInterval 120
-
- Host target
- HostName $HOST
- Port $PORT
- IdentityFile ~/.ssh/id_rsa
- User user
其中ServerAliveInterval是为了保持心跳,$HOST是目标机器的IP,如192.168.10.22,$PORT 是 目标机器ssh server的端口, 如22, 2202。
这个配置文件可以像“类”那样继承的,比如Host * 中的Port 22 和ServerAliveInterval 120 是可以被target继承的,如果target的ssh server Port也是22,就不用再写了,如果不是22,才需要写出来。
然后配置免密登录:
ssh-copy-id -i .ssh/id_rsa user@$HOST -p $PORT
第一次输好密码,后面就不用输密码了,就像mobaxterm帮你记住了一样。
- ssh target
- scp some_file target:/home/user
- rsync -avP * target:/home/user/some_dir
我正常的操作流程是command+空格,呼出iterm,然后敲几个ssh或者scp这样的字符,zsh会自动补全常用的命令,其实比打开mobaxterm然后鼠标点击要方便的。
或者右击文件,打开iterm,然后输入scp命令也是很方便的:
看到这里,可能有知友会说这样的话我在~/.bashrc里写一个alias,像这样
alias ssh_target='ssh user@$HOST -p $PORT'
不也差不多嘛。确实,对于这种简单的场景,两者是差不多的。ssh config的便利性更体现在要通过跳板机登录的场景。
在某些场景下,往往是不能直接访问目标机器的,通常是用先登录一台机器(此机器通常被称为跳板机/堡垒机/gateway),然后再在这台机器上登录目标机器,我们可以借助ssh config来简化这种操作。在~/.ssh/config中配置:
- Host gateway
- HostName $GATEWAY_HOST
- Port $GATEWAY_PORT
- IdentityFile ~/.ssh/id_rsa
- User $GATEWAY_USER
-
- Host target
- HostName $TARGET_HOST
- User $TARGET_USER
- IdentityFile ~/.ssh/id_rsa
- ProxyCommand ssh gateway nc %h %p 2> /dev/null # 或者 ProxyCommand ssh gateway -W %h:%p
其中:
- %h 表示 hostname
- %p 表示 port
然后配置免密登录,和上面一样,也只需要第一次输入密码:
ssh target 'mkdir -p .ssh && cat > .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
然后可以无感知地ssh/scp/rsync到目标机器,在终端中也只需要输入目标机器的别名就行:
- ssh target
- scp some_file target:/home/user
- rsync -avP * target:/home/user/some_dir
mobaxterm可以在登录后执行自定义命令,在ssh config中Host下面增加如下两行可达到同样目的的:
- RemoteCommand cd /xxx && /bin/bash
- RequestTTY yes
其中RequestTTY为了避免执行ssh target之后hang住, RemoteCommand是在远程机器上执行的命令, 但是需要本机的open ssh版本大于等于7.6(可用ssh -V查看),如果RemoteCommand不生效, 可把ssh config中的RemoteCommand和RequestTTY删除,用如下方式:
ssh -t target "cd xxx; bash"
如果连'ssh target'中的'ssh '都不想敲呢,还有一招,可以补全这个'ssh ',在~/.bashrc(或者~/.bash_profie 或 ~/.zshrc类似文件)中增加
- # Auto complete ssh server defined in ~/.ssh/config
- # complete -W "$(awk '/^Host/{if ($2!="*") print $2}' ~/.ssh/config)" ssh
-
- # Define ssh alias for server defined in ~/.ssh/config
- for host in $(awk '/^Host/{if ($2!="*") print $2}' ~/.ssh/config); do
- alias $host="ssh $host"
- done
以后在终端中输入'target'就等于'ssh target'了,当然此时target最好取个有意义的名称。
ssh config中配置的别名也可以用在python中,不论是否有跳板机,这是自然的,但是容易被忽略,比如
- import subprocess
-
- subprocess.check_call("scp some_file target:/home/user", shell=True)
mobaxterm里还有一个好用的功能是ssh tunnel(ssh 隧道),因为我的tunnel不是太多,我是用alias来做的,
先安装autossh,autossh主要是帮助ssh程序在中断后自动重连的
brew install autossh
然后在~/.bashrc(或者~/.bash_profie 或 ~/.zshrc类似文件)中增加
alias t_some_tunnel='autossh -M 20001 -N -f -L 18123:127.0.0.1:8123 user@$HOST'
可以把$HOST上的18123端口映射到本地的8123 端口上, -M 20001的意思是设置监视端口20001用于监视这个ssh会话。
原文地址:Terminal太难用,MAC下有类似于mobaxterm的软件吗? - 知乎
免密登陆
ssh-copy-id命令解析
ssh-copy-id user@server ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。