這篇內容源自 Github 上面一個有意思的分享。說的是這個分享者的一個前同事,作者說他是活在命令行中的人。只有要任何工作會耗費他 90 秒以上的時間,他就會寫一個腳本來自動處理。
這位程序員寫的這些腳本被收集整理后發到了 Github 上面,和大家一起分享,并且已經獲得了 2 萬多顆星星。
-
smack-my-bitch-up.sh
: 這個腳本用于在加班的時候自動給他的老婆發短信。具體是怎么做到的呢,每天晚上 9 點的時候會檢測這臺電腦的命令行是否還在工作。如果命令行還在工作,就會從預置的三條信息中隨機選一條發出去。
來看看他是怎么做到的:
#!/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
命令檢測當前正在工作的終端用戶有沒有自己,如果沒有就直接退出,如果有則繼續操作。 接下來預設一些變量,比如自己和老婆的電話號碼,加班原因。 然后通過 curl 命令調用 api.twilio.com
的短信發送接口將信息發出去。
最后判斷發送是否成功,如果發送失敗,將日志打印出來。看起來挺復雜的操作,其實看看實際的腳本并不困難吧。
-
kumar-asshole.sh
: 這個也很有意思,從郵箱的收件箱里面掃描一個叫Kumar
(公司一個客戶的 DBA) 的人發來的郵件,從郵件的內容中確認是否包含 help,trouble,sorry 這類詞語,如果包含,就自動通過 SSH 鏈接這個客戶的數據庫,并將數據庫回滾到上一次備份。然后再回一封郵件說:“不要擔心,下次注意就好。”
來看看這個腳本:
#!/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 寫的。 首先,調用 GMAIL.inbox.find
從收件箱中查找符合條件的郵件 — 發件人為 kumar.a@example.com
,并且包含關鍵字 KEYWORDS_REGEX = /sorry|help|wrong/i
。
如果找到相關郵件,先判斷數據備份文件 backup_file
是否存在。 然后調用 gunzip 和 psql 命令還原這個備份。 最后調用 create_reply
方法創建回復郵件,并發出去。
這個腳本雖然說很方便,但還是比較依賴具體場景的。如果使用不得當也有可能會造成誤還原等。當然它還是能幫我們打開一些思路的。
-
hangover.sh
:又是一個定時通知的程序,這個在每天早上 8:45 的時候檢測服務器的命令行中有沒有自己登錄,如果沒有,自動給老板發短信請假。
代碼如下:
#!/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 給咖啡機發送命令制作一個中杯拿鐵咖啡。咖啡制作完成后,再等待 24 秒,然后把制作好的咖啡放到杯子里面。 這個整好是這個程序員從桌子走到咖啡機前的時間。
當然,前提是你得有一臺可以聯網并且接收命令的咖啡機。
腳本如下:
#!/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
這個腳本也很好理解,首先判斷當前用戶是否登錄,只有用戶登錄才會發送下面的命令給咖啡機。
腳本介紹完了,要讓這些跑起來還需要做一些準備工作:
# 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 里面設置一下定時執行任務的規則:
# 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
結束
看完這篇文章后,你是覺得這些腳本非常有創意,還是很無聊呢? 這個就見仁見智了。 不過這位有意思的程序員確實幫我們擴展了一下思路。命令行腳本能做的事情比我們平時想到的還要多。
完整內容可以參看它的 Github 主頁:https://github.com/NARKOZ/hacker-scripts。 當然也歡迎你的留言交流。
更多精彩內容可關注微信公眾號:
swift-cafe