iterm2 触发器——triggers使用(mac sz rz)

3,044 阅读7分钟

iterm2官方文档对于triggers的介绍

背景

从本地电脑上往服务器上传文件场景是这样的:

  1. 可以直接登录服务器【使用 scprsync 从本地电脑直接上传、下载文件】
  2. 登录跳板机后,再从跳板机登录服务器【使用 scprsync 从本地电脑上传、下载文件到跳板机,再从跳板机使用 scprsync 上传、下载文件到目标服务器】
  3. 登录跳板机后【跳板机只有有限权限,比如只有一个选择菜单去选择跳转到哪个服务器】,再从跳板机登录服务器

在上面的第 3 种情况下,就不能像第 2 种情况一样把跳板机当成文件中转站了,需要直接从本地电脑上传文件到服务器。这就涉及到了这个文档 Mac osx 下安装iTerm2,并使用rz sz上传下载(附homebrew配置)。 从这里面得知可以使用 rzsz 命令。

对于当前终端窗口来说,无论当前是在本地电脑还是远程服务器,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 就是个触发器,当在 iterm2 的一个会话窗口中出现了一个字符串时(手打或代码打印均可),会判断该字符串是否匹配某个 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 的一个坑。 iter2 中可以设置某个 profile 为默认的配置,这样新打开的窗口时(包括使用其他profile的新窗口)都会以它的配置为基础去加载。

如果按照文档设置 trigger 的时候不是设置在默认的那个 profile 上,就会在打开新窗口的时候不加载那些 trigger 的配置,就会发现正则始终无法触发,也就不会去执行我们期望的脚本。

这个默认的 profile (profile 列表中前面会自动显示一个星星)一般刚安装 iterm2 时默认是名字叫 default 的那个,但是由于 profile 的名字也可以修改,是不是默认也可以修改,所以在按照文档去设置的时候,先确认下配置的是不是带星星的那个 profile。

item2 怎么设置某个 profile 为默认:选中一个profile, 在other actions 选择 set as default。

在服务器使用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 权限都不能有。