阅读 149

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

背景

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

  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 就是当在 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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐