1、創建文件夾 創建文件夾主要是為了後面東西打包方便。名字隨意。我這裡創建名為:Macos 2、下載印表機驅動 印表機驅動格式一般是pkg格式,其他格式的暫未測試,如果是其他格式的可以直接看我的代碼怎麼寫的參考一下我的邏輯。 3、創建配置文件 註意‼️:在剛纔創建的文件夾下午創建,這一步創建的主要用 ...
1、創建文件夾
創建文件夾主要是為了後面東西打包方便。名字隨意。我這裡創建名為:Macos
2、下載印表機驅動
印表機驅動格式一般是pkg格式,其他格式的暫未測試,如果是其他格式的可以直接看我的代碼怎麼寫的參考一下我的邏輯。
3、創建配置文件
註意‼️:在剛纔創建的文件夾下午創建,這一步創建的主要用作於存放印表機的一些信息的,分別為:印表機名稱,ip地址,是否啟用
參考一下我的示例,我在 Macos 文件夾下創建了一個無擴展名的文件,叫:Print。信息如下
印表機名稱,ip地址,是否啟用
杭州3L黑白,172.19.2.3,Y
杭州4L黑白,172.19.2.4,Y
杭州5L黑白,172.19.2.5,Y
杭州11L黑白,172.18.2.99,N
北京一樓零食區,172.16.24.11,N
北京HR辦公室,172.16.3.161,N
4、創建密碼文件
這一步是創建ini的配置文件,用於存密碼的。創建文件名:
apperk-config.ini
,文件內容如下
[SYSTEM]
PASS=""
DATE=""
DESCRIPTION="將輸入的密碼記錄在臨時目錄中,防止安裝重覆輸入密碼,一般情況下重啟電腦就會被自動清理"
5、寫安裝腳本
創建一個 名為:
install.sh
的文件,文件內容如下
#!/bin/bash
#- - - - - - - - -- --Script comment information - - - - - - - - - -
#Author: 拉基
#Email: [email protected]
#Creation time: 2022-10-18
#FileName: temp.sh
#Blog address: https://www.cnblogs.com/98record/
#Copyright (C) 2022All rights reserved
#- - - - - - - - - - - - - end - - - - - - - - - - - - - - - - - -
clear
RED='\033[0;31m'
GRN='\033[0;32m'
YELLOW="\033[0;33m"
BLU='\033[0;34m'
LIGHT_GRAY="\033[0;37m"
LIGHT_GREEN="\033[1;32m"
NC='\033[0m'
# 密碼加密密鑰
key="6d6163776b2e636f6d2d6d6163776b2d636f6d2f6dd163776b21136f12"
iv="3534363122333334"
# 定義一個初始目錄路徑
###=================================
### 獲取當前目錄
###=================================
parentPath=$(
cd "$(dirname "$0")"
pwd -P
)
### 進入當前目錄
cd "$(dirname "$0")"
echo
# 驅動安裝程式路徑
driverInstall=$( find "$parentPath" -name '*.pkg' -maxdepth 1)
# 本機驅動程式包地址,這是蘋果印表機固定地址
driverPath_init="/Library/Printers/PPDs/Contents/Resources/"
# 獲取任何來源狀態
spctlStatus=$(spctl --status 2>/dev/null)
# 印表機信息路徑
infoPath=$( find "$parentPath" -name 'Print' -maxdepth 1)
infoContent=$(awk -F ',' 'NR!=1 { print }' "$infoPath")
# 判斷是不是m1型號
cpuinfo=$(sysctl -n machdep.cpu.brand_string)
rosetta_Path="/Library/Apple/usr/share/rosetta/rosetta"
# ini 配置文件目錄
iniTmpDir=/tmp/apperk-config/
iniTmpFile=apperk-config.ini
echo -e "${LIGHT_GREEN}>${NC}『xxx印表機』自動安裝器"
echo -e "${BLU}如安裝有問題請截圖聯繫IT-help處理${NC}"
# Start 關閉 Terminal 視窗
function closeTerminal() {
if [ "${1}" ]; then
delayValue="${1}"
else
delayValue=1
fi
if [ "$TERM_PROGRAM" == "Apple_Terminal" ]; then
osascript -e 'delay '"${delayValue}"
osascript -e 'tell application "Terminal" to close first window' &
exit
else
osascript -e 'delay '"${delayValue}"
exit
fi
}
# End 關閉 Terminal 視窗
# Start 讀取寫入 ini 配置文件
function readIni() {
file="${1}"
section="${2}"
item="${3}"
val=$(awk -F '=' '/\['${section}'\]/{a=1} (a==1 && "'${item}'"==$1){a=0;print $2}' ${file})
password=$(echo "${val}" | sed 's/^"//' | sed 's/"$//')
password_pre="${password:0:7}"
if [ "${password_pre}" == "apperk-" ]; then
decrypt_str=$(echo "${password:7}==" | openssl enc -e -aes-256-cbc -a -K ${key} -iv ${iv} -nosalt -d 2>/dev/null)
echo ""${decrypt_str}""
else
echo "${password}"
fi
}
function writeIni() {
file="${1}"
section="${2}"
item="${3}"
val="${4}"
if [ "${item}" == "PASS" ]; then
encrypt_str="apperk-$(echo "${val}" | openssl enc -e -aes-256-cbc -a -K ${key} -iv ${iv} -nosalt 2>/dev/null)"
else
encrypt_str="${val}"
fi
awk -F '=' '/\['${section}'\]/{a=1} (a==1 && "'${item}'"==$1){gsub($2,"\"'"${encrypt_str}"'\"");a=0} {print $0}' ${file} 1<>${file}
}
# End 讀取寫入 ini 配置文件
# Start 判斷是否開啟了事件
function testSystemEvents() {
/usr/bin/osascript <<EOT
tell application "System Events"
try
do shell script "cd ./"
return 1
on error errorMessage number errorNumber
return errorNumber
end try
end tell
EOT
}
# End 判斷是否開啟了事件
# Start 密碼輸入視窗
function authPassword() {
local authPass="${1}"
/usr/bin/osascript <<EOT
on getAuthPass()
tell application "System Events"
activate
repeat
with timeout of 86400 seconds
display dialog "請輸入您的電腦開機密碼或鎖屏密碼後點擊繼續:" ¬
default answer "" ¬
with title "xxx印表機安裝" ¬
with hidden answer ¬
buttons {"退出", "繼續"} default button 2
if button returned of the result is "退出" then
return "exitapperk"
exit repeat
else if the button returned of the result is "繼續" then
set pswd to text returned of the result
set usr to short user name of (system info)
try
do shell script "echo test" user name usr password pswd with administrator privileges
do shell script "$(makeIniDir)"
return pswd
exit repeat
end try
end if
end timeout
end repeat
end tell
end getAuthPass
tell application "System Events"
activate
set pswd to text of the "${authPass}"
set usr to short user name of (system info)
try
do shell script "echo test" user name usr password pswd with administrator privileges
return pswd
on error
my getAuthPass()
end try
end tell
EOT
}
function setSudo() {
authPass=$(authPassword "${1}")
# 如果點擊退出按鈕,則中止
if [ "$authPass" == "exitapperk" ]; then
echo -e "${YELLOW}您未輸入密碼,正在為您取消本次安裝。${NC}"
closeTerminal
else
if [ -z "${authPass}" ]; then
echo -e "\n\n"
echo -e "${RED}無法讀取您輸入的密碼,請在下方鑰匙圖標後輸入您的電腦密碼。${NC}(密碼輸入的過程中是看不到的,輸入完成按下回車鍵)"
echo
read -s authPass
fi
local currentDate=$(date +%s)
# 將密碼寫書入 ini 文件
local writeinipass=$(writeIni $iniTmpDir/$iniTmpFile SYSTEM PASS "${authPass}" 2>/dev/null)
local writeinidate=$(writeIni $iniTmpDir/$iniTmpFile SYSTEM DATE ${currentDate} 2>/dev/null)
# 代替sudo命令的函數
sudo() {
/bin/echo "${authPass}" | /usr/bin/sudo -S "$@"
}
sudo -- sh -c "chmod 777 $iniTmpDir/$iniTmpFile" &>/dev/null
sudo -- sh -c "chmod 777 $iniTmpDir/*" &>/dev/null
fi
}
# End 密碼輸入視窗
# Start 創建配置目錄
function makeIniDir() {
# 將 ini 配置文件複製到 臨時文件/tmp 目錄
rm -rf "${iniTmpDir}" &>/dev/null
mkdir -p "${iniTmpDir}" &>/dev/null
cp -a "${parentPath}/${iniTmpFile}" "${iniTmpDir}" &>/dev/null
}
# End 創建配置目錄
function countDown() {
secs=$1
shift
while [ $secs -gt 0 ]; do
printf "\r本視窗 %.d 秒後自動關閉" $((secs--))
sleep 1
done
}
if [ $(testSystemEvents) == '-1743' ]; then
echo -e "${YELLOW}您未授權自動化請求!${NC}請前往${CYAN}「系統偏好設置 -> 安全性與隱私 -> 隱私 -> 自動化」${NC}中${GREEN}勾選「終端」${NC}項下麵的${GREEN}「System Events」${NC},然後重新安裝。"
echo
countDown 20
echo
closeTerminal
fi
if [ -f "${iniTmpDir}/${iniTmpFile}" ]; then
# 讀取 ini 配置文件中的密碼
iniPass="$(readIni ${iniTmpDir}/${iniTmpFile} SYSTEM PASS)"
iniDate="$(readIni ${iniTmpDir}/${iniTmpFile} SYSTEM DATE)"
currentDate=$(date +%s)
if [[ "${iniPass}" ]] && [[ "${iniDate}" ]]; then
#超過6個小時重新獲取密碼
if [ $(($currentDate - $iniDate)) -gt 21600 ]; then
makeIniDir
# 獲取密碼
setSudo
else
# 傳遞密碼
setSudo "${iniPass}"
fi
else
makeIniDir
# 獲取密碼
setSudo
fi
else
makeIniDir
# 獲取密碼
setSudo
fi
# Start 判斷 AppleScript 授權狀態
# End 判斷 AppleScript 授權狀態
# End 判斷是否存在配置文件
if [[ ${spctlStatus} == *"enabled"* ]]; then
echo -e "${LIGHT_GRAY}您系統當前不允許運行非 App Store 安裝的軟體,${NC}正在為您開啟任何來源"
sudo -- sh -c "spctl --master-disable &>/dev/null"
fi
if [[ "$cpuinfo" == Apple* ]] ;then
n=0
while (($n < 10000000)); do
n=$((n + 1))
echo -e "正在檢測Rosetta工具是否已安裝,第${n}次……"
if [ ! -e "$rosetta_Path" ]; then
echo
echo -e "${LIGHT_GRAY}檢測到未安裝Rosetta工具,正在進行安裝………${NC}"
/usr/sbin/softwareupdate --install-rosetta --agree-to-license && \
break
else
echo -e "${LIGHT_GRAY}檢測到已經安裝Rosetta工具,接下來檢測是否接入內網.${NC}"
break
fi
# break
done
fi
# 查詢是否連接公司無線,如果不是則提醒用戶連接Wi-Fi
current_wifi=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/AIrport -I | \
awk '/ SSID/ {print substr($0, index($0, $2))}')
# echo -e "${LIGHT_GRAY}正在查詢你的網路狀態,是否接入內網.${NC}" && \
if [[ "$current_wifi" == *temp ]] || [[ "$current_wifi" == *Inc ]] ;then
sudo -- sh -c "installer -pkg $driverInstall -target /" && \
#如果是其他型號的話則替換name即可
driverPath=$(find $driverPath_init -name '*36C-9*' -maxdepth 1)
# 迴圈讀取 Print中的內容並且安裝印表機
for line in $infoContent;do
name=$(echo "$line" | awk -F ',' '{ print $1}')
ip=$(echo "$line" | awk -F ',' '{ print $2}')
decide=$(echo "$line" | awk -F ',' '{ print $3}')
# 生成該印表機的時候CUPS用來作為該印表機的文件名
printername="$name"
# 印表機的物理位置,比如說財務辦公室,前臺印表機等等,這個信息是可選的
# location="$name"
# 在GUI中顯示的印表機名稱
gui_display_name="$name"
# 印表機地址
address="Socket://$ip"
# 如果是禁用狀態,並且電腦存在此印表機名的則刪除,否則安裝
if [[ "$decide" == N ]] && lpstat -p "$name" -l > /dev/null 2>&1;then
lpadmin -x "$name" > /dev/null 2>&1
elif [[ "$decide" == Y ]];then
# echo $driverPath
# 添加印表機
# echo "不存在並且啟用印表機: $name"
/usr/sbin/lpadmin \
-p "${printername}" \
-D "${gui_display_name}" \
-v "${address}" \
-P "${driverPath}" \
-o printer-is-shared=false \
-E > /dev/null 2>&1
fi
done
if [ $? -eq 0 ];then
echo -e "${RED}印表機名帶彩色字樣的則支持彩色列印,黑白字樣則不支持彩色列印${NC}\n${GRN}安裝完成,正在關閉本視窗……${NC}\n"
hdiutil detach -force "${parentPath}" &>/dev/null
sleep 4 && \
# osascript -e "do Shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit
closeTerminal
else
echo "${RED}安裝失敗請截圖聯繫it-help${NC}"
fi
else
# 使用Mac 彈窗告警功能,提示員工需要連接公司內網Wi-Fi
osascript -e 'tell application (path to frontmost application as text) to display dialog "請使用temp或Inc尾碼 Wi-Fi 後重新運行此安裝腳本" buttons {"OK"} with icon stop' && \
# osascript -e "do Shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit
hdiutil detach -force "${parentPath}" &>/dev/null && \
closeTerminal
fi
註意事項‼️
- 操作完後文件夾中應該是下麵圖片這個樣子(pkg文件就是印表機驅動)
- 我的代碼中寫了檢測WiFi的,如果你們不需要就直接刪了就行,需要的話則改成你們自己的WiFi名稱。
- 別的好像也沒有什麼要註意的了,有問題再說