在 ssh 里面把服務(wù)器的文本復(fù)制到本地電腦
使用 macOS 的同學(xué),應(yīng)該熟悉一個(gè)命令pbcopy,它可以在命令行中把一段內(nèi)容寫入到剪貼板,例如:
- echo "kingname" | pbcopy
就能把字符串kingname復(fù)制到剪貼板里面。我們也可以使用這個(gè)方法把一個(gè)文件中的內(nèi)容寫入到剪貼板:
- cat xxx.txt | pbcopy
這樣我們就不需要把文件打開再手動(dòng)復(fù)制的。
有時(shí)候,我要把服務(wù)器上面的日志復(fù)制下來。原來都是進(jìn)入服務(wù)器以后,用 vim 打開日志文件,用鼠標(biāo)選中再復(fù)制。且不說服務(wù)器是 Linux,沒有pbcopy這個(gè)命令,即使有這個(gè)命令,服務(wù)器上又怎么能訪問本地的剪貼板呢?
在網(wǎng)上一搜,竟然還真有辦法。使用OSC52實(shí)現(xiàn)iTerm2遠(yuǎn)程pbcopy - 風(fēng)雪之隅[1]這篇文章借助 iterms 的一個(gè)功能和幾個(gè)特殊的字符,通過 php 實(shí)現(xiàn)了這個(gè)功能。我們來把它改寫成 Python 版本。
首先打開 iterms 的設(shè)置,把方框框住的這一項(xiàng)勾上:
然后,在 iterms 里面,通過 ssh 連上服務(wù)器。
然后,我們來寫一段 Python 代碼:
- import base64
- print('\033]52;c;' + base64.b64encode('青南'.encode()).decode() + '\007')
然后在服務(wù)器上運(yùn)行這段代碼,運(yùn)行效果如下圖所示:
什么都沒有打印出來?但不要擔(dān)心,現(xiàn)在,你隨便找一個(gè)可以打字的輸入框,按下鍵盤上面的Command +V鍵。你會(huì)發(fā)現(xiàn),青南兩個(gè)字竟然被粘貼出來了!
有了這個(gè)機(jī)制,我們就來人工寫一個(gè)pbcopy.py,接收管道的輸入:
其中,#! /usr/bin/python3是遠(yuǎn)程服務(wù)器上面 Python 的地址。你可以通過命令which python3找到這個(gè)地址。
保存完成以后,給他添加可執(zhí)行權(quán)限:chmod +x pbcopy.py。
現(xiàn)在,我們?cè)囈辉嚢堰h(yuǎn)程的多行文本復(fù)制到本地的剪貼板中:
我這里復(fù)制的就是這個(gè)代碼自身。大家也可以使用其他文件來測(cè)試。復(fù)制完成以后,我們隨便找個(gè)地方粘貼,發(fā)現(xiàn)復(fù)制成功!
現(xiàn)在,我們使用軟連接,把這個(gè)可執(zhí)行文件變得更像命令一些:
- sudo ln -s /home/ubuntu/pbcopy.py /usr/bin/pbcopy
運(yùn)行效果如下圖所示:
完美滿足要求。
需要注意的是,這個(gè)程序會(huì)把管道輸入的所有內(nèi)容全部接收完成以后才會(huì)復(fù)制,所以,如果你輸入的文本內(nèi)容太大,可能會(huì)撐爆內(nèi)存。