iterm2 触发器——triggers使用(mac sz rz)
背景
从本地电脑上往服务器上传文件场景是这样的:
可以直接登录服务器【使用
scp
或rsync
从本地电脑直接上传、下载文件】登录跳板机后,再从跳板机登录服务器【使用
scp
或rsync
从本地电脑上传、下载文件到跳板机,再从跳板机使用scp
或rsync
上传、下载文件到目标服务器】登录跳板机后【跳板机只有有限权限,比如只有一个选择菜单去选择跳转到哪个服务器】,再从跳板机登录服务器
在上面的第 3 种情况下,就不能像第 2 种情况一样把跳板机当成文件中转站了,需要直接从本地电脑上传文件到服务器。这就涉及到了这个文档 Mac osx 下安装iTerm2,并使用rz sz上传下载(附homebrew配置)。
从这里面得知可以使用 rz
及 sz
命令。
对于当前终端窗口来说,无论当前是在本地电脑还是远程服务器,rz
指的都是接收文件。比如在终端窗口中,直接输入 rz
后回车【假如当前在本地,指的就是本地要接收文件,假如当前在服务器,指的就是服务器要接收文件】。
如何使用 rz
在终端窗口中,直接输入 rz
后回车后,紧接着终端就会出现一行字符串 rz waiting to receive.**B0100000023be50
,接下来通过 sz
命令发送文件内容给它就可以把文件发送给执行 rz
命令时所在的环境的文件夹路径下了【如果是在本地执行的 rz
,那就传到的本地执行 rz
时所在的文件夹下】。而直接手动使用 sz
命令的话对于操作者不太友好,我们希望通过弹出文件选择窗口的方式进行。
我们通过一个 shell 脚本来实现:弹出文件选择窗口+选中文件后发送文件。如下iterm2-send-zmodem.sh
(文件名字自己取):
#!/bin/bash # 这个脚本来自 github,删掉了一些 ** 言论。 osascript -e 'tell application "iTerm2" to version' > /dev/null 2>&1 && NAME=iTerm2 || NAME=iTerm if [[ $NAME = "iTerm" ]]; then FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose file with prompt "Choose a file to send"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"` else FILE=`osascript -e 'tell application "iTerm2" to activate' -e 'tell application "iTerm2" to set thefile to choose file with prompt "Choose a file to send"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"` fi if [[ $FILE = "" ]]; then echo Cancelled. # Send ZModem cancel echo -e \\x18\\x18\\x18\\x18\\x18 sleep 1 echo echo \# Cancelled transfer else /opt/homebrew/bin/sz "$FILE" --escape --binary --bufsize 4096 sleep 1 echo echo \# Received $FILE fi复制代码
可以看到,直接执行这个脚本(后面不跟参数),首先进入的是上面的 else
去弹出一个 prompt
,即打开一个文件选择窗口去选择文件,因为脚本是同步的,所以选择完后,如果点击的是取消,进入的就是下面的 if
, 响应了一个 Cancelled
,如果选择了文件,那么就进入了下面的 else
,执行了 sz
命令去发送文件。
这里有一个细节需要注意,就是 MAC 电脑按照上面的文档通过brew install lrzsz
安装 rz
sz
后,M1 芯片的电脑和 Intel 芯片的电脑,这两个命令的位置会不一样,我这里示例的是 M1 芯片的电脑,路径是 /opt/homebrew/bin/sz
和 /opt/homebrew/bin/rz
。可以通过点击电脑左上角的苹果图标->关于本机 去查看是什么芯片,进一步通过 which sz
which rz
命令查看路径。查看完后,如果不一样,需要手动修改上面的脚本中的那个路径。 否则,有些同学执行的时候会报错,找不到 sz 命令等错误。
设置 triggers
每次 rz
回车后,都要手动执行 iterm2-send-zmodem.sh
脚本的话,还是比较麻烦,而且因为上一条 rz
命令还没有结束,在当前会话窗口也没法执行这个脚本。所以最好是自动触发执行该脚本。这就可以引入 iterm2 的 triggers 触发器功能。
A trigger is an action that is performed when text matching some regular expression is received in a terminal session.
根据最上面的官方文档介绍,trigger 就是当在 iter2 的一个会话窗口中出现了匹配设置的某个 trigger 预置的正则条件的字符串时,会执行该 trigger 设置时指定的相应动作【有很多,比如高亮、响个bell、执行个脚本等】。
我们输入 rz
回车后,会话窗口会立即打印一串字符串 rz waiting to receive.**B0100000023be50
,我们刚好就利用这个功能,设置一个 trigger,去执行我们的 iterm2-send-zmodem.sh
脚本。
设置 trigger就按照这个文档就行 Mac osx 下安装iTerm2,并使用rz sz上传下载(附homebrew配置)。
除此之外,你可以设置任意的 trigger,比如点 + 号新增一个 trigger,把正则规则设置为 123
, 把 action 设置为 Hilight Line 红色,那么每当在终端输入包含 123 的字符串时,该行就会高亮为红色。
设置 triggers 时的小坑
这个是关于 iterm2 默认 profile 的一个坑。
在服务器使用rz时的流程
在 iterm2 的终端会话窗口登录服务器
输入
rz
回车会话窗口会立即打印一串字符串
rz waiting to receive.**B0100000023be50
触发执行
iterm2-send-zmodem.sh
脚本弹出文件选择弹窗,选择文件
选中文件,触发脚本中的 sz 命令去传送文件
传送完毕
关于其他未使用的脚本和命令
sz
直接执行 sz
就是传送文件,它需要后面跟参数。
iterm2-send-zmodem.sh
直接在终端执行 /usr/local/bin/iterm2-send-zmodem.sh
, 弹出窗口选完文件去发送后,会打印 **B00000000000000
,按照同样的 trigger 原理会触发我们按照文档添加的另外一个 trigger 去执行 /usr/local/bin/iterm2-recv-zmodem.sh
,这个脚本是选择把目标文件放到哪个文件夹后再执行脚本里面的 rz
命令建立文件传输通道去接收文件。
iterm2-recv-zmodem.sh
直接在终端执行 /usr/local/bin/iterm2-recv-zmodem.sh
, 弹出窗口选择接收文件要存放发文件夹后,然后执行了脚本中的 rz
命令,再后面就跟手动再终端直接执行 rz
一样了,只不过再终端直接执行 rz
命令时,相当于默认选中了当前文件夹作为接收文件的文件夹路径。
其他
mac finder 怎么打开bin目录:Mac下/usr/local目录默认是对于Finder是隐藏,如果需要到/usr/local下去,打开Finder,然后使用command+shift+G,在弹出的目录中填写/usr/local就可以了。 ssh 登录使用 config 配置 pem 文件时,pem 文件其他人连 r 权限都不能有。
作者:Junyang1023
链接:https://juejin.cn/post/7039168659733872677