Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mysql结果批量执行bash命令_Mysql_Bash - Fatal编程技术网

使用mysql结果批量执行bash命令

使用mysql结果批量执行bash命令,mysql,bash,Mysql,Bash,我通过bash脚本维护多个具有相同web应用程序的服务器。命令基本上包括ssh和scp,它们对于每个服务器都是相同的,只是服务器之间的IP、用户和端口不同。到目前为止,我编写了与服务器一样多的命令,以便在同一个脚本中进行维护。这很好,但是当我开始有很多服务器需要维护时,我更愿意在MySQL表中列出这些服务器,然后在我的bash脚本中使用这个列表,因此当我有新的服务器需要维护时,我不需要更新所有的服务器 目前,我在以正确的方式从MySQL中提取数据时遇到了一些问题,这些数据可以在bash脚本中执行

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

目前,我在以正确的方式从MySQL中提取数据时遇到了一些问题,这些数据可以在bash脚本中执行

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

outputofquery=$$MYSQL-u$USER-batch-p$PASSWORD-skip列名-h$HOST-e选择CONCAT'scp-p',server_-port','$file',server_-USER',@',server_-ip',:/var/www/html/site/'FROM server_-ssh$数据库名 echo${outputofquery%$'\t;'*} 给出以下结果:

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命令,而忽略之前的命令


您能告诉我如何使用MySQL表中的数据批量执行ssh和scp命令吗?

我是新手,无法发表评论

您是否尝试过在mysql连接的末尾添加\n或&&

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

ips_和_端口=$$MYSQL-u$USER-batch-p$PASSWORD-跳过列名-h$HOST-e从extranet.server_ssh选择服务器_端口、服务器_ip$数据库名 对于$ips_和_端口中的$line 做 OLDIFS=$IFS; IFS=;将分隔符设置为制表符PS:这是4个空格,请相应更改 美元行中的美元el 做 套装-$el;按制表符分隔每行,并将变量分配给$1、$2。。 端口=$1; ip=2美元; scp-p22text.php user1@$ip:/var/www/html/site/scp-P$port 完成; IFS=$OLDIFS;将分隔符恢复为其原始值 完成; 我还没有测试代码,但我希望你明白我的想法

祝你好运


有关IFS和OLDIFS的更多信息,请参见

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

!/垃圾箱/垃圾箱 主机=本地主机 用户=根 DBNAME=mydb 密码=mypassord MYSQL=/Applications/XAMPP/bin/MYSQL file='text.php' i=0; 命令=; ips_和_端口=$$MYSQL-u$USER-p$PASSWORD-h$HOST-BNe从服务器_ssh选择服务器_端口、服务器_用户、服务器_ip$数据库名 对于$ips_和_端口中的线路 做 i++;增加行号 如果[$$i%3-eq 1]检查它是否是从MySQL服务器\u端口提取的行的第一个元素 然后 command=scp-P$行;初始化要执行的新命令 elif[$$i%3-eq 2]检查它是否是从MySQL服务器\u用户提取的行的第二个元素 然后 命令+=$file$line@;连接 elif[$$i%3-eq 0]检查它是否是从MySQL服务器\u ip提取的行的第三个元素 然后 command+=$line:/var/www/html/my_web_app/;;连接 eval$命令;执行命令 fi 完成;
非常感谢您的反馈。很遗憾,添加\n或&&不会更改任何内容。下面描述的方法很有趣,不幸的是,$line中的值只包含一个字段,而不是SELECTI中的所有字段。我发现它在查询结果中使用了分隔符。第一个for-then在您也应该将$IFS更改为的行上正确循环。我认为问题在于,默认情况下分隔符是所有类型的空白,而不是\n非常感谢,但不是更好。无论如何,我找到了一个解决方案,通过连接要执行的命令,我将脚本放在这个线程中的一个单独的答案中