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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...