這篇內(nèi)容源自 Github 上面一個有意思的分享。說的是這個分享者的一個前同事愕鼓,作者說他是活在命令行中的人钙态。只有要任何工作會耗費他 90 秒以上的時間,他就會寫一個腳本來自動處理菇晃。
這位程序員寫的這些腳本被收集整理后發(fā)到了 Github 上面册倒,和大家一起分享,并且已經(jīng)獲得了 2 萬多顆星星磺送。
-
smack-my-bitch-up.sh
: 這個腳本用于在加班的時候自動給他的老婆發(fā)短信驻子。具體是怎么做到的呢,每天晚上 9 點的時候會檢測這臺電腦的命令行是否還在工作估灿。如果命令行還在工作崇呵,就會從預置的三條信息中隨機選一條發(fā)出去。
來看看他是怎么做到的:
#!/bin/sh -e
# Exit early if no sessions with my username are found
if ! who | grep -wq $USER; then
exit
fi
# Phone numbers
MY_NUMBER='+xxx'
HER_NUMBER='+xxx'
REASONS=(
'Working hard'
'Gotta ship this feature'
'Someone fucked the system again'
)
rand=$[ $RANDOM % ${#REASONS[@]} ]
RANDOM_REASON=${REASONS[$rand]}
MESSAGE="Late at work. "$RANDOM_REASON
# Send a text message
RESPONSE=`curl -fSs -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
-d "From=$MY_NUMBER" -d "To=$HER_NUMBER" -d "Body=$MESSAGE" \
"https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages"`
# Log errors
if [ $? -gt 0 ]; then
echo "Failed to send SMS: $RESPONSE"
exit 1
fi
這個腳本中甲捏,先用 who
和 grep
命令檢測當前正在工作的終端用戶有沒有自己演熟,如果沒有就直接退出,如果有則繼續(xù)操作司顿。 接下來預設一些變量芒粹,比如自己和老婆的電話號碼,加班原因大溜。 然后通過 curl 命令調(diào)用 api.twilio.com
的短信發(fā)送接口將信息發(fā)出去化漆。
最后判斷發(fā)送是否成功,如果發(fā)送失敗钦奋,將日志打印出來座云「碓看起來挺復雜的操作,其實看看實際的腳本并不困難吧朦拖。
-
kumar-asshole.sh
: 這個也很有意思圃阳,從郵箱的收件箱里面掃描一個叫Kumar
(公司一個客戶的 DBA) 的人發(fā)來的郵件,從郵件的內(nèi)容中確認是否包含 help,trouble,sorry 這類詞語璧帝,如果包含捍岳,就自動通過 SSH 鏈接這個客戶的數(shù)據(jù)庫,并將數(shù)據(jù)庫回滾到上一次備份睬隶。然后再回一封郵件說:“不要擔心锣夹,下次注意就好∷涨保”
來看看這個腳本:
#!/usr/bin/env ruby
require 'dotenv'
require 'gmail'
Dotenv.load
GMAIL_USERNAME = ENV['GMAIL_USERNAME']
GMAIL_PASSWORD = ENV['GMAIL_PASSWORD']
GMAIL = Gmail.connect(GMAIL_USERNAME, GMAIL_PASSWORD)
KUMARS_EMAIL = 'kumar.a@example.com'
DB_NAME_REGEX = /\S+_staging/
KEYWORDS_REGEX = /sorry|help|wrong/i
def create_reply(subject)
GMAIL.compose do
to KUMARS_EMAIL
subject "RE: #{subject}"
body "No problem. I've fixed it. \n\n Please be careful next time."
end
end
GMAIL.inbox.find(:unread, from: KUMARS_EMAIL).each do |email|
if email.body.raw_source[KEYWORDS_REGEX] && (db_name = email.body.raw_source[DB_NAME_REGEX])
backup_file = "/home/backups/databases/#{db_name}-" + (Date.today - 1).strftime('%Y%m%d') + '.gz'
abort 'ERROR: Backup file not found' unless File.exist?(backup_file)
# Restore DB
`gunzip -c #{backup_file} | psql #{db_name}`
# Mark as read, add label and reply
email.read!
email.label('Database fixes')
reply = create_reply(email.subject)
GMAIL.deliver(reply)
end
end
這個腳本是用 ruby 寫的银萍。 首先,調(diào)用 GMAIL.inbox.find
從收件箱中查找符合條件的郵件 — 發(fā)件人為 kumar.a@example.com
恤左,并且包含關鍵字 KEYWORDS_REGEX = /sorry|help|wrong/i
贴唇。
如果找到相關郵件,先判斷數(shù)據(jù)備份文件 backup_file
是否存在赃梧。 然后調(diào)用 gunzip 和 psql 命令還原這個備份滤蝠。 最后調(diào)用 create_reply
方法創(chuàng)建回復郵件豌熄,并發(fā)出去授嘀。
這個腳本雖然說很方便,但還是比較依賴具體場景的锣险。如果使用不得當也有可能會造成誤還原等蹄皱。當然它還是能幫我們打開一些思路的。
-
hangover.sh
:又是一個定時通知的程序芯肤,這個在每天早上 8:45 的時候檢測服務器的命令行中有沒有自己登錄巷折,如果沒有,自動給老板發(fā)短信請假崖咨。
代碼如下:
#!/bin/sh -e
# Exit early if any session with my username is found
if who | grep -wq $USER; then
exit
fi
# Phone numbers
MY_NUMBER='+xxx'
NUMBER_OF_BOSS='+xxx'
EXCUSES=(
'Locked out'
'Pipes broke'
'Food poisoning'
'Not feeling well'
)
rand=$[ $RANDOM % ${#EXCUSES[@]} ]
RANDOM_EXCUSE=${EXCUSES[$rand]}
MESSAGE="Gonna work from home. "$RANDOM_EXCUSE
# Send a text message
RESPONSE=`curl -fSs -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
-d "From=$MY_NUMBER" -d "To=$NUMBER_OF_BOSS" -d "Body=$MESSAGE" \
"https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages"`
# Log errors
if [ $? -gt 0 ]; then
echo "Failed to send SMS: $RESPONSE"
exit 1
fi
這個腳本基本邏輯和我們前面的差不多锻拘,就不多贅述了。
-
fucking-coffee.sh
:這個是這里面最有意思的腳本击蹲,腳本運行時會先等待 17 秒署拟,然后通過 telnet 給咖啡機發(fā)送命令制作一個中杯拿鐵咖啡「璨颍咖啡制作完成后推穷,再等待 24 秒,然后把制作好的咖啡放到杯子里面类咧。 這個整好是這個程序員從桌子走到咖啡機前的時間馒铃。
當然蟹腾,前提是你得有一臺可以聯(lián)網(wǎng)并且接收命令的咖啡機。
腳本如下:
#!/usr/bin/env ruby
# Exit early if no sessions with my username are found
exit unless `who -q`.include? ENV['USER']
require 'net/telnet'
coffee_machine_ip = '10.10.42.42'
password = '1234'
password_prompt = 'Password: '
delay_before_brew = 17
delay = 24
sleep delay_before_brew
con = Net::Telnet.new('Host' => coffee_machine_ip)
con.cmd('String' => password, 'Match' => /#{password_prompt}/)
con.cmd('sys brew')
sleep delay
con.cmd('sys pour')
con.close
這個腳本也很好理解区宇,首先判斷當前用戶是否登錄娃殖,只有用戶登錄才會發(fā)送下面的命令給咖啡機。
腳本介紹完了议谷,要讓這些跑起來還需要做一些準備工作:
# used in `smack-my-bitch-up` and `hangover` scripts
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
# used in `kumar_asshole` script
GMAIL_USERNAME=admin@example.org
GMAIL_PASSWORD=password
這個是設置 TWILIO 平臺的 Key珊随, 你需要注冊一個,地址是 https://www.twilio.com柿隙。 還需要按照上面的格式設置一下你的 GMAIL 用戶名和密碼叶洞。
然后還需要在 Cron 里面設置一下定時執(zhí)行任務的規(guī)則:
# Runs `smack-my-bitch-up.sh` monday to friday at 9:20 pm.
20 21 * * 1-5 /path/to/scripts/smack-my-bitch-up.sh >> /path/to/smack-my-bitch-up.log 2>&1
# Runs `hangover.sh` monday to friday at 8:45 am.
45 8 * * 1-5 /path/to/scripts/hangover.sh >> /path/to/hangover.log 2>&1
# Runs `kumar-asshole.sh` every 10 minutes.
*/10 * * * * /path/to/scripts/kumar-asshole.sh
# Runs `fucking-coffee.sh` hourly from 9am to 6pm on weekdays.
0 9-18 * * 1-5 /path/to/scripts/fucking-coffee.sh
結(jié)束
看完這篇文章后,你是覺得這些腳本非常有創(chuàng)意禀崖,還是很無聊呢衩辟? 這個就見仁見智了。 不過這位有意思的程序員確實幫我們擴展了一下思路波附。命令行腳本能做的事情比我們平時想到的還要多艺晴。
完整內(nèi)容可以參看它的 Github 主頁:https://github.com/NARKOZ/hacker-scripts。 當然也歡迎你的留言交流掸屡。
更多精彩內(nèi)容可關注微信公眾號:
swift-cafe