网络安全-Linux基础(bash脚本)

文章目录

    • bash脚本编写基础
      • 使用的脚本解析器/bin/bash(声明)
      • bash脚本需要拥有执行权限
      • bash脚本语法
        • 输入与输出
        • 函数的封装
        • 条件判断语句
          • 条件符号
        • 循环语句
        • 模块化编程
    • Linux进程操作
      • 查看寻找进程
      • 终止进程
      • 暂停与恢复进程
      • 后台运行
    • bash脚本编写
      • 系统内存资源占用

bash脚本编写基础

使用的脚本解析器/bin/bash(声明)

#!/bin/bash
  • #! ,由 “#” 和 “!” 两个字符组成的特殊标记。当一个可执行文件以这两个字符开头时,内核会将该行的其余部分作为解释器的路径来读取,并使用该解释器来执行这个文件的后续内容。
  • /bin/bash 是指 bash解释器的路径。
  • 所以 #!/bin/bash 整体的意思就是指定这个脚本文件应该由 Bash 解释器来执行。

bash脚本需要拥有执行权限

是否拥有执行的权限,表示脚本是否可以进行执行

  • 使用ls -liah进行详细目录查看
  • 权限修改可以使用chmod 777 www.sh 用户、用户组、其他用户都给最高权限(读、写、执行)

bash脚本语法

输入与输出
  1. 输入
  • read name 输入一个值,并赋值给name
  • 赋值给name后需要使用$进行解析如$name
  1. 输出
  • echo 对于字符进行整行输出
  • printf 类似与C语言
printf "My name is %s and I am %d years old.\n" $name $age

前面""中需要有格式化符号,后面才是变量.

函数的封装
  1. 不含参数函数定义调用
greet () {echo "Hello, World!"
}

函数调用

#!/bin/bash
greet
  1. 含参函数定义调用
add_numbers () {sum=$(($1 + $2))echo "The sum of $1 and $2 is $sum"
}

函数调用

#!/bin/bash
add_numbers 3 5
  • 当然也可以存在rutern 返回值

  • $() 与 反引号``的异同

都可以用于获取指令结果,但建议使用$(),因为它可以嵌套,而反引号不支持。

条件判断语句
  1. if 语句基本结构
    • 在 Bash 编程中,if语句用于条件判断。基本结构如下:
if [ condition ]; then# 条件为真时执行的命令commands
fi
  • 其中,[ condition ]是条件表达式部分,;用于分隔条件表达式和then关键字(也可以将;换成换行)。then后面的commands是当条件为真时要执行的命令序列。
  • fi是一个关键字,用于标识if语句块的结束
  • 例如,判断一个变量是否大于 10:
#!/bin/bash
num=15
if [ $num -gt 10 ]; thenecho "$num is greater than 10"
fi
  • 这里的$num -gt 10是条件表达式,-gt是用于比较大小的操作符,表示 “大于”。当num的值大于 10 时,就会执行echo命令。
  • 除了只在条件为真时执行命令,还可以在条件为假时执行其他命令,这就用到了if - else语句。结构如下:
if [ condition ]; thencommands1
elsecommands2
fi
  • 例如,判断一个数是偶数还是奇数:
#!/bin/bash
num=7
if [ $((num % 2)) -eq 0 ]; thenecho "$num is even"
elseecho "$num is odd"
fi
  • 这里使用$((num % 2)) -eq 0作为条件表达式,%是取余运算,-eq是 “等于” 操作符。如果num除以 2 的余数为 0,则为偶数,执行echo偶数相关的命令;否则为奇数,执行echo奇数相关的命令。
  1. if - elif - else 语句
  • 当需要判断多个条件时,可以使用if - elif - else语句。结构如下:
if [ condition1 ]; thencommands1
elif [ condition2 ]; thencommands2
……
elsecommandsn
fi
  • 例如,根据分数范围输出等级:
#!/bin/bash
score=85
if [ $score -ge 90 ]; thenecho "A"
elif [ $score -ge 80 ]; thenecho "B"
elif [ $score -ge 70 ]; thenecho "C"
elif [ $score -ge 60 ]; thenecho "D"
elseecho "F"
fi
  • 这里依次判断分数是否大于等于 90、80、70、60,根据不同的范围输出相应的等级。如果分数小于 60,则输出F
条件符号
  • 数值比较操作符

    • -lt:小于。
    • -le:小于等于。
    • -eq:等于。
    • -ne:不等于。
    • -ge:大于等于。
    • -gt:大于。
  • 字符串比较操作符

    • = 或 ==:相等(在多数 Bash 环境下,不过 “==” 可能在某些版本中不被支持)。
    • !=:不相等。
    • -z:判断字符串长度是否为 0。
    1. if - else 语句
  • 文件判断使用到的参数
    -e 文件名 如果文件存在则为真
    -f 文件名 如果文件存在且为普通文件则为真
    -d 文件名 如果文件存在且为目录则为真
    -r 文件名 如果文件存在且可读则为真
    -w 文件名 如果文件存在且可写则为真
    -x 文件名 如果文件存在且可执行则为真
    -s 文件名 如果文件存在且至少有一个字符则为真
    -c 文件名 如果文件存在且为字符型特殊文件则为真
    -b 文件名 如果文件存在且为块特殊文件则为真

  • 条件判断使用到的逻辑操作符
    ①与 的表示方法:&&、-a

​ 要求所有条件为真,则条件为真

​ ②或 的表示方法:||、-o

​ 要求任意条件为真,则条件为真

​ ③非 的表示方法:!

​ 要求条件反转为真时,条件为真

循环语句
  1. for 循环
    • 基本语法:
      • for循环用于遍历一系列的值,通常是一个列表。基本格式为:
for variable in list; docommands
done
  • 其中variable是循环变量,用于依次存储list中的每个元素;list可以是一个用空格分隔的值列表、一个数组或者是一个由命令生成的结果集;commands是在每次循环中要执行的命令。
  • 遍历列表示例:
    • 例如,遍历一个数字列表并打印每个数字:
for number in 1 2 3 4 5; doecho $number
done
  • 这里number会依次取12345,并在每次循环中通过echo命令输出。
  • 遍历数组示例:
    • 假设定义了一个数组fruits,并使用for循环遍历它:
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"; doecho $fruit
done
  • 在这个例子中,${fruits[@]}表示数组fruits的所有元素,fruit会依次取数组中的每个元素并输出。
  • 使用命令生成列表示例:
    • 可以使用命令的输出作为for循环的列表。例如,通过ls命令列出当前目录下的文件,并逐个打印文件名:
for file in $(ls); doecho $file
done
  • 不过要注意,这种方式如果文件名中有空格等特殊字符可能会出现问题,更安全的做法是使用while循环和read命令结合来处理有特殊字符的文件名。
  1. while 循环
  • 基本语法:
    • while循环在条件为真时持续执行命令块。基本格式为:
while [ condition ]; docommands
done
  • 其中[ condition ]是条件表达式,commands是每次循环要执行的命令。
  • 简单计数示例:
    • 例如,从 1 开始计数,直到数字达到 5:
count=1
while [ $count -le 5 ]; doecho $countcount=$((count + 1))
done
  • 在这里,count初始值为 1,每次循环判断count是否小于等于 5,如果是则打印count的值,然后将count的值加 1。当count大于 5 时,循环结束。
  • 读取文件内容示例:
    • 假设要逐行读取一个文件的内容,可以这样做:
while read line; doecho $line
done < file.txt
  • 这个循环会不断读取file.txt文件中的一行内容存储到line变量中,然后通过echo命令输出该行内容,直到文件结束。
  1. until 循环
  • 基本语法和特点:
    • until循环与while循环相反,它在条件为假时持续执行命令块,直到条件变为真。基本格式为:
until [ condition ]; docommands
done
  • 例如,计算从 1 加到某个数,直到总和大于等于 10:
sum=0
num=1
until [ $sum -ge 10 ]; dosum=$((sum + num))num=$((num + 1))
done
echo $sum
  • 在这里,开始时sum为 0,num为 1,每次循环将num累加到sum中,并将num加 1,直到sum大于等于 10,循环结束后输出sum的值。
  1. 循环控制语句
  • break 语句:用于立即跳出循环。例如,在for循环中,如果满足某个条件就跳出循环:
for i in 1 2 3 4 5; doif [ $i -eq 3 ]; thenbreakfiecho $i
done
  • 这个循环在i等于 3 时就会跳出,所以只会输出 1 和 2。
  • continue 语句:用于跳过当前循环的剩余部分,直接进入下一次循环。例如:
for i in 1 2 3 4 5; doif [ $i -eq 3 ]; thencontinuefiecho $i
done
  • i等于 3 时,continue语句会跳过echo命令,直接进入下一次循环,所以会输出 1、2、4、5。
模块化编程

就是在本脚本中调用其他脚本的函数,以此来实现模块化编程

#!/bin/bash
source update.sh
update $n1 $n1
echo$0文件中运行update.sh的函数update
  • $0是一个特殊的变量,它代表当前脚本的文件名。当脚本被执行时,$0会被自动赋值为脚本文件的名称。(类似与Windows系统dos编程中的%0
  • source是一个命令(也可以用 “.” 来代替,如 “.” filenamesource filename效果相同)。它的主要作用是在当前脚本环境中读取并执行另一个文件中的命令。(相当于文件包含

Linux进程操作

查看寻找进程

  1. ps 命令
    • 基本语法ps [options]。例如,ps -ef是最常用的查看进程的命令组合。-e选项表示显示所有进程,-f选项用于显示完整格式的信息。
    • 详细解释:它会列出进程的 UID(用户 ID)、PID(进程 ID)、PPID(父进程 ID)、C(CPU 使用率)、STIME(进程启动时间)、TTY(终端类型)、TIME(累计 CPU 时间)和 CMD(命令行)等信息。例如,在命令行输入ps -ef后,会看到类似如下的输出:
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 11:00?        00:00:01 /sbin/init
root         2     0  0 11:00?        00:00:00 [kthreadd]
  • 其他常用选项:
    • ps -aux:显示所有包含其他用户的进程,并且以 BSD 风格输出。其中a选项表示显示所有终端下的进程,包括其他用户的进程;u选项以用户为中心组织输出;x选项表示显示没有控制终端的进程。
  1. top 命令
  • 基本语法top。直接在命令行输入top后,会进入一个实时显示系统进程状态的界面。
  • 详细解释:它会按照 CPU 使用率、内存使用率等对进程进行排序,并动态更新。在这个界面中,可以看到系统的负载情况(load average),包括 1 分钟、5 分钟和 15 分钟的平均负载。每一行代表一个进程,显示的信息和ps -ef有一些重叠,如 PID、USER、PR(优先级)、NI(Nice 值)、VIRT(虚拟内存大小)、RES(物理内存大小)等。
  • 操作方式:在top界面中,可以通过按键来进行操作。例如,按P键可以按照 CPU 使用率排序进程,按M键可以按照内存使用率排序进程,按q键可以退出top界面。
  1. pgrep 命令
  • 基本语法pgrep [options] pattern。例如,pgrep -l firefox用于查找名称中包含firefox的进程并显示其 PID 和名称。
  • 详细解释:它是通过进程名称或者其他属性来查找进程的 PID。-l选项表示在输出中同时显示进程名称。如果只需要 PID,可以不使用-l选项。

终止进程

  1. kill 命令
    • 基本语法kill [signal] PID。例如,kill -9 1234表示强制终止 PID 为 1234 的进程。
    • 详细解释signal是发送给进程的信号,默认信号是TERM(15),它会请求进程正常终止。如果进程没有响应TERM信号,可以使用-9SIGKILL)信号来强制终止进程。不过,强制终止进程可能会导致数据丢失或系统不稳定,因为进程没有机会进行清理操作。
    • 注意:在使用kill -9时要谨慎,尽量先尝试使用默认的TERM信号来终止进程。
  2. pkill 命令
    • 基本语法pkill [options] pattern。例如,pkill -9 firefox用于强制终止所有名称中包含firefox的进程。
    • 详细解释:它是通过进程名称或者其他属性来终止进程,和pgrep命令类似,但是它的功能是终止进程而不是查找 PID。-9选项同样表示强制终止。

暂停与恢复进程

  • 暂停进程:可以使用kill -STOP PID来暂停一个进程。例如,kill -STOP 5678会暂停 PID 为 5678 的进程。此时,进程会暂停执行,并且不会占用 CPU 资源,直到收到恢复信号。
  • 恢复进程:使用kill -CONT PID来恢复一个被暂停的进程。例如,kill -CONT 5678会恢复之前被暂停的 PID 为 5678 的进程,使其继续正常运行。

后台运行

  1. 在后台运行进程
    • 方法一:命令后加 & 符号。例如,./long_running_script.sh &。这样,long_running_script.sh这个脚本就会在后台运行,命令行提示符会立即返回,用户可以继续在命令行进行其他操作。
    • 方法二:使用 nohup 命令nohup command &,例如nohup python my_script.py &nohup(no hang up)命令用于在用户退出登录后,进程仍然能够继续运行。它会将进程的输出重定向到nohup.out文件中(默认情况下)。
  2. 将后台进程恢复到前台
    • 基本语法fg %n。其中n是作业号。可以通过jobs -l命令来查看后台作业的作业号和 PID。例如,如果jobs -l显示后台作业的作业号为 1,PID 为 9876,那么fg %1就可以将这个后台作业恢复到前台运行。

bash脚本编写

系统内存资源占用

#!/bin/bash
TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}')
USE_MEM=$((TOTAL_MEM * 30 / 100))
USE_MEM_MB=$((USE_MEM / 1024))
while true;domemtester $USE_MEM_MB 1wait $!
done
  • TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}')

  • grep MemTotal /proc/meminfo/proc/meminfo是 Linux 系统下一个虚拟文件,它包含了系统当前的内存信息。grep MemTotal命令用于在/proc/meminfo文件中查找包含 “MemTotal” 字样的行,该行记录了系统的总内存量信息。

  • awk '{print $2}'awk是一种文本处理工具。在这里,它用于从grep找到的包含 “MemTotal” 的行中提取第二个字段的值,也就是系统总内存量的值(以 KB 为单位)。最终将提取到的值赋给变量TOTAL_MEM

  • USE_MEM=$((TOTAL_MEM * 30 / 100))

使用算术扩展($((...)))来计算需要占用的内存量。它将变量TOTAL_MEM(系统总内存量,以 KB 为单位)乘以 30 再除以 100,得到的结果就是要占用的内存量(同样以 KB 为单位),并将这个结果赋给变量USE_MEM

  • USE_MEM_MB=$((USE_MEM / 1024))

再次使用算术扩展,将变量USE_MEM(以 KB 为单位的要占用的内存量)除以 1024,从而将其转换为以 MB 为单位的内存量,并将结果赋给变量USE_MEM_MB

  • memtester $USE_MEM_MB 1

使用memtester工具进行内存测试。$USE_MEM_MB是前面计算并转换得到的要占用的内存量(以 MB 为单位),1在这里可能是memtester工具要求的某个参数(比如可能表示测试的次数或者其他相关参数,具体取决于memtester的版本和使用方式)。这个命令会启动memtester对指定的内存量进行测试。

  • wait $!

  • $!是一个特殊的 Bash 变量,它表示最近在后台运行的命令的进程 ID(PID)。在这里,由于memtester命令刚刚在后台运行(因为memtachers通常会在后台执行内存测试操作),所以$!获取到的就是memtester的进程 ID。

  • wait命令用于等待指定的进程完成。在这里就是等待memtester的进程完成其内存测试操作,确保每次memtester测试都能完整执行完毕后再进入下一次循环。

tester $USE_MEM_MB 1`

使用memtester工具进行内存测试。$USE_MEM_MB是前面计算并转换得到的要占用的内存量(以 MB 为单位),1在这里可能是memtester工具要求的某个参数(比如可能表示测试的次数或者其他相关参数,具体取决于memtester的版本和使用方式)。这个命令会启动memtester对指定的内存量进行测试。

  • wait $!

  • $!是一个特殊的 Bash 变量,它表示最近在后台运行的命令的进程 ID(PID)。在这里,由于memtester命令刚刚在后台运行(因为memtachers通常会在后台执行内存测试操作),所以$!获取到的就是memtester的进程 ID。

  • wait命令用于等待指定的进程完成。在这里就是等待memtester的进程完成其内存测试操作,确保每次memtester测试都能完整执行完毕后再进入下一次循环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今天出了10个4声母 .com

价格蛮低的 &#xff0c;VJ.VT.Q.Q 十个 遥想当年6.5万收的5个四声母.com&#xff0c;上面有2个就在下图中呀&#xff0c;赔大发了

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目

OKG Research:用户意图驱动的Web3应用变革

出品&#xff5c; OKG Research 作者&#xff5c;Samuel QIN 当前加密市场的快速演变中&#xff0c;用户增长成为行业可持续发展的基石。目前主流观点在推动行业前进的路上&#xff0c;从单纯的技术探索在向更注重应用价值的方向转变。尽管近年来Web3生态系统发展迅速&#xf…

云渲染与云电脑,应用场景与技术特点全对比

很多朋友问&#xff0c;你们家一会宣传云渲染&#xff0c;一会宣传云电脑的&#xff0c;我到底用哪个&#xff1f;今天&#xff0c;渲染101云渲染和川翔云电脑就来对比下两者的区别&#xff01; 渲染101&川翔云电脑&#xff0c;都是我们的产品&#xff0c;邀请码6666 一、…

鸿蒙进阶篇-属性动画-animateTo转场动画

大家好啊&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习属性动画-animateTo&转场动画&#xff0c;咱们先来学习属性动画-animateTo 属性动画-animateTo 属性动画 animation是作为属性使用&#xff0c;而animateTo显示动画是一个系统的内置函数&#xff0c;可以…

我谈正态分布——正态偏态

目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution&#xff0c;normal是“正常”或“标准”的意思&#xff0c;中文翻译是正态&#xff0c;多完美的…

从无音响Windows 端到 有音响macOS 端实时音频传输播放

以下是从 Windows 端到 macOS 端传输音频的优化方案&#xff0c;基于上述链接中的思路进行调整&#xff1a; Windows 端操作 安装必要软件 安装 Python&#xff08;确保版本兼容且已正确配置环境变量&#xff09;。安装 PyAudio 库&#xff0c;可通过 pip install pyaudio 命令…

AI知识库在行业应用中的未来趋势与案例分析

在数字化转型的浪潮中&#xff0c;AI知识库正成为企业提升效率和创新能力的关键工具。本文将探讨AI知识库在不同行业的应用案例&#xff0c;并分析其未来发展趋势。 一、汽修行业的AI知识库应用 汽修行业正通过构建内部知识库来提升服务质量和工作效率。一个完善的内部知识库能…

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55 前面我们讲述了几种BootLoader中的命令&#xff0c;包括获取软件版本号、获取帮助、获取芯片ID、读取Flash保护Level。 下面我们来介绍一下BootLoader中最重要的功能之一—跳转&#xff01;就像BootLoader词汇中的Boot…

sqlite3数据库的相关API使用

1 1:使用sqlite3_exec函数读取数据库的数据,将这些数据存入链表遍历该链表&#xff0c;输出“字段”“数据”2:使用sqlite3_get_table读取数据库的数据写一个“字段" "数据”输出的循环 1 #include <stdio.h> #include <string.h> #include <unistd.…

基于Python下载HYCOM-3hourly数据(可无脑用)

基于Python下载HYCOM-3hourly数据 一、安装库二、主要函数2.1 draw_time_range2.2 download2.2.1 下载函数2.2.2 必传入参数&#xff1a;2.2.3 其他参数&#xff1a; 2.3 merge5nc 三、完整代码3.1 乱七八糟版3.2 精简版3.3 get_time_list 四、效果4.1 终端4.2 nc文件4.3 全文本…

Hbase集群搭建

1. 环境 三台节点hadoop 集群zookeeper 集群hbase 1.1环境准备 使用前文hdfs三台节点 1.11 zookeeper搭建 下载 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz zookee…

为什么用SQL而不是Excel+VBA?

SQL主要服务数据库 SQL服务的是MySQL、Oracle、SQL Sever、Hive等各大数据库&#xff0c;它们都需要SQL来管理、定义。题主理解的SQL只限于查询数据、清洗数据&#xff0c;这些当然ExcelVBA都能做到&#xff0c;任何编程语言都能做到&#xff0c;但事实是SQL是数据库的管理工具…

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时&#xff0c;随着物体表面的形状和相机视角的变化&#xff0c;会导致纹理在渲染过程中出现一些问题&#xff0c;如锯齿…

OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示

当打开蓝牙后没有反应时&#xff0c;需要排查蓝牙节点是否对应、固件是否加载成功&#xff0c;本文介绍开源鸿蒙OpenHarmony4.1系统下适配蓝牙的方法&#xff0c;触觉智能SBC3568主板演示 修改对应节点 开发板蓝牙硬件连接为UART1&#xff0c;修改对应的节点&#xff0c;路径为…

Kafka高频面试题详解

1、kafka是如何做到高效读写 1&#xff09;Kafka 本身是分布式集群&#xff0c;可以采用分区技术&#xff0c;并行度高 2&#xff09;读数据采用稀疏索引&#xff0c;可以快速定位要消费的数据。&#xff08;mysql中索引多了之后&#xff0c;写入速度就慢了&#xff09; 3&a…

ML 系列: 第 23 节 — 离散概率分布 (多项式分布)

目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况&#xff1a;二项分布 2.4 期望值 &#xff08;Mean&#xff09; 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模&#xff1a;随机变量可以采用两个可能的值&#…

MFC工控项目实例三十实现一个简单的流程

启动按钮夹紧 密闭&#xff0c;时间0到平衡 进气&#xff0c;时间1到进气关&#xff0c;时间2到平衡关 检测&#xff0c;时间3到平衡 排气&#xff0c;时间4到夹紧开、密闭开、排气关。 相关代码 void CSEAL_PRESSUREDlg::OnTimer_2(UINT nIDEvent_2) {// if (nIDEvent_21 &am…

当使用key-value方式进行参数传递时,若key对应的是一个对象或数组结构,如何利用API Post工具进行模拟操作。

1. 后端服务代码如下 RequestMapping("/handle11")public Person handle11(Person person){System.out.println(person);return person;} 2. 后端入参结构 person是一个对象&#xff0c;对象结构如下&#xff1a; public class Person {private String username …

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的链接名: MY_ODBC_MYSQL 以…