Mac印表機一鍵安裝

来源:https://www.cnblogs.com/98record/archive/2023/05/11/mac-da-yin-ji-yi-jian-an-zhuang.html
-Advertisement-
Play Games

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名稱。
  • 別的好像也沒有什麼要註意的了,有問題再說

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好代碼是優化出來的,不是寫出來的!! 如果沒看前面文章,可以先看前面幾篇 SpringBoot定義優雅全局統一Restful API 響應框架 ...
  • 對象存儲是雲的基礎組件之一,各大雲廠商都有相關產品。這裡跟大家介紹一下rust與對象存儲交到的基本套路和其中的一些技巧。 ...
  • 抽象類:在子類繼承父類時,父類的一些方法實現是不明確的(父類對子類的實現一無所知)。這時需要使父類是抽象類,在子類中提供方法的實現。 介面(interface)技術主要用來描述類具有什麼功能,而並不給出每個功能的具體實現。 ...
  • 你好,我是@馬哥python說,一枚10年程式猿。 一、效果演示 以下是我近期用Python開發的原創可視化數據分析大屏,非常適合畢設用,下麵逐一展示:(以下是截圖,實際上有動態交互效果哦) 以下大屏均為@馬哥python說的個人原創,請勿轉載。 1.1 影視劇分析大屏 1.2 豆瓣電影分析大屏A ...
  • 隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章... ...
  • 引言 在單元或者集成測試的過程中,需要測試的用例非常多,如果測試是一條一條過,那麼需要花費不少的時間。從 V2 開始,預設情況下 XUnit 自動配置並行(參考資料),大大提升了測試速度。本文將對 ASP.NET CORE WEBAPI 程式進行集成測試,並探討 XUnit 的數據共用與測試並行的方 ...
  • 1.S5PV210 概述 1.1 架構概述 S5PV210 是一款 32 位 RISC 高性價比、低功耗、高性能的微處理器解決方案,適用於手機和一般應用。它集成了ARM Cortex-A8內核,實現了ARM架構V7-A,支持外設。 為3G和3.5G通信業務提供優化的硬體(H/W)性能,S5PV210 ...
  • 哈嘍大家好,我是鹹魚。今天給大家分享一個關於 HTTP 有趣的現象 鏈接:https://csvbase.com/meripaterson/stock-exchanges 我們用瀏覽器訪問這個鏈接,可以看到下麵的網頁 但如果我們使用 curl 命令去訪問這個鏈接呢? 可以看到返回的是一個 csv 文 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...