首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mysql结果批量执行bash命令

问用mysql结果批量执行bash命令
EN

Stack Overflow用户
提问于 2019-04-19 09:02:08
回答 2查看 159关注 0票数 0

我通过bash脚本维护了几个具有相同web应用程序的服务器。命令基本上包括ssh和scp,它们对于每个服务器都是相同的,只是服务器之间的IP、用户和端口是不同的。到目前为止,我编写的命令和服务器一样多,要在相同的脚本中维护。这很好,但是由于我开始有许多服务器要维护,我更愿意在MySQL表中列出这些服务器,然后在bash脚本中使用这个列表,因此,当我有新的服务器要维护时,我不需要更新所有这些服务器。

目前,我在正确地从MySQL中提取数据时遇到了问题,然后可以在bash脚本中执行。

我目前的方法是在查询中使用CONCAT函数,如下所示:

代码语言:javascript
复制
outputofquery=$($MYSQL -u"$USER" --batch -p"$PASSWORD" --skip-column-names -h"$HOST" -e "SELECT CONCAT('scp -P ', server_port, ' $file ', server_user, '@', server_ip, ':/var/www/html/site/') FROM server_ssh;" $DBNAME)
echo ${outputofquery%$'\t;'*}

给出了以下结果:

代码语言:javascript
复制
scp -P 22 text.php user1@1.1.1.1:/var/www/html/site/ scp -P 12345 text.php user2@2.2.2.2:/var/www/html/site/

由MySQL查询产生的每个命令都放在同一行上,这意味着这不能执行。

我想在site/在查询中的后面添加一个分号,这样即使每个命令都在同一行上,它们也可以单独执行,但只执行最后一个scp命令,而忽略前面的命令。

请让我知道如何用来自表的数据批量执行和scp命令。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-20 10:35:48

最后,我成功地使用MySQL数据执行批处理命令。根据从MySQL提取的行号,构建使用串联函数执行的命令。下面是我的剧本

代码语言:javascript
复制
#!/bin/sh

HOST="localhost"
USER="root"
DBNAME="mydb"
PASSWORD="mypassord"
MYSQL="/Applications/XAMPP/bin/mysql"

file='text.php'
i=0;
command='';

ips_and_ports=$($MYSQL -u"$USER" -p"$PASSWORD" -h"$HOST" -BNe "SELECT server_port,server_user,server_ip FROM server_ssh;" $DBNAME)
for line in $ips_and_ports
do
    (( i++ )); #increment the line number

    if [ $(($i % 3)) -eq 1 ] #check if it is the first element of a line extracted from MySQL (server_port)
    then
        command="scp -P $line"; #initialize a new command to execute
    elif [ $(($i % 3)) -eq 2 ] #check if it is the second element of a line extracted from MySQL (server_user)
    then
        command+=" $file $line@"; #concatenate
    elif [ $(($i % 3)) -eq 0 ] #check if it is the third element of a line extracted from MySQL (server_ip)
    then
        command+="$line:/var/www/html/my_web_app/;"; #concatenate
        eval $command; #execute the command 
    fi
done;
票数 1
EN

Stack Overflow用户

发布于 2019-04-19 09:28:18

我不能发表评论因为我是新来的。

您是否尝试过将\n或&&放在mysql连接的末尾?

您还可以更改方法,将服务器和端口分配给变量,并在这些变量上循环以执行ssh和scp命令。例如

代码语言:javascript
复制
ips_and_ports=$($MYSQL -u"$USER" --batch -p"$PASSWORD" --skip-column-names -h"$HOST" -e "SELECT server_port, server_ip FROM extranet.server_ssh;" $DBNAME)
for $line in $ips_and_ports
do
    OLDIFS=$IFS;
    IFS="    "; # set the separator to the tab character (PS: this is 4 spaces, change accordingly )
    for $el in $line
    do
        set -- $el; # separate each line by tab and assign the variables to $1, $2 ..
        port=$1;
        ip=$2;
        scp -P 22 text.php user1@$ip:/var/www/html/site/ scp -P $port
    done;
    IFS=$OLDIFS; # put the separator back to it's original value
done;

我还没有测试代码,但我希望你能理解我的想法!

祝好运

关于link中IFS和OLDIFS的更多信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55759272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档