linux脚本从数据库读取数据并根据数据在远程linux上发送命令

时间:2014-03-18 11:10:14

标签: linux bash

我是关于Linux脚本的新手。在我在Linux机器上运行的本地Mysql数据库中:

mysql> SELECT * FROM folder;
+-------+---------+
| user  | folder  |
+-------+---------+
| user1 | folder1 |
| user2 | folder2 |
| user3 | folder3 |
+-------+---------+

我需要阅读数据库" folder1"并在远程Linux上发送命令" mkdir folder1"
所以脚本可以创建自动folder1-3。远程Linux密码不是问题。

现在我手动完成

ssh root@www1.cyberciti.biz mkdir folder1
ssh root@www1.cyberciti.biz mkdir folder2
ssh root@www1.cyberciti.biz mkdir folder3

4 个答案:

答案 0 :(得分:1)

像这样排序答案

 #!/bin/bash
myvar=$(mysql -D database -u username -p  password -se "SELECT folder FROM folder"| xargs echo -n)
ssh root@www1.cyberciti.biz mkdir "$myvar"

答案 1 :(得分:1)

你可以在一行中完成;这里是测试版。它只打印出命令。放弃回声'真正执行命令。

mysql testdb --batch --skip-column-names -p -e "select distinct(folder) from folder" | xargs -n 1 -I '{}' echo ssh root@www1.cyberciti.biz mkdir \"{}\"

输出:

ssh root@www1.cyberciti.biz mkdir "folder1"
ssh root@www1.cyberciti.biz mkdir "folder2"
ssh root@www1.cyberciti.biz mkdir "folder3"

答案 2 :(得分:0)

while read id; do 
    ssh root@www1.cyberciti.biz "mkdir $id"
done < <(mysql -u $USER -p $PASSWORD $DATABASE -e "SELECT folder FROM folder;" --skip-column-names)

答案 3 :(得分:0)

这里有各种答案的好处。我们混合鸡尾酒。

首先,如评论中所述,您可能希望在循环而不是单个命令行中执行此操作。虽然xargs是一个功能强大,有用的命令,但在这种情况下,您可能希望将内容分开,以便将来插入其他功能。

其次,如上所述,您需要考虑列标题。安德烈斯非常正确地批评其他答案而忽略了--skip-column-names选项。

第三,就目前而言,如果第二次运行,脚本将尝试重新创建目录。一旦制作了目录,你想把事情标记为已完成。

因此...

#!/bin/bash

sql="SELECT folder FROM folder WHERE created=NULL"

mysql_opts=()
mysql_opts+=(--skip-column-names)      # obvious
mysql_opts+=(--host=dbhost)            # database server
mysql_opts+=(--user=username)          # mysql username
mysql_opts+=(--password=password)      # mysql password
mysql_opts+=(-D dbname)                # database name

while read name; do
  if [[ ! $name =~ ^[[:alnum:]_]+$ ]]; then
    echo "ERROR: invalid characters in '$name'" >&2
  elif ssh remotehost "mkdir '/path/to/${name}'"; then
    mysql "${mysql_opts[@]}" -e"UPDATE folder SET created=NOW() WHERE folder='$name'"
  else
    echo "ERROR: failed to create '$name'" >&2
  fi
done < <( mysql "${mysql_opts[@]}" -e"$sql" )

编程时,一定要考虑将来维护工作需要多少努力。如果选项清晰且记录良好,那么当事情中断时,您可以更快地修复它们。

因此,我们在bash数组中设置mysql的选项。

然后我们正在经历一个循环。循环的输入是最后一行done之后的命令。这称为“Process Substitution”。

在循环中,我们有if首先进行一些输入验证(也可以在SELECT中完成),如果文件夹名称通过,则运行ssh命令。但ssh命令作为另一个if的一部分运行。如果成功,我们将记录标记为完成,并带有时间戳。如果不成功,我们会对此感到吵闹。 (显然,您需要created表中的folder列。)

显然,您可以根据自己的错误做任何事情 - 发送寻呼机信息,发送电子邮件,通知您的监控系统等。重要的是您要考虑到失败,并采取相应措施。 (如果在运行最后一个mkdir时出现临时网络故障,会发生什么?)

如果有任何混淆,请告诉我。我很乐意澄清。