我是关于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
答案 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
时出现临时网络故障,会发生什么?)
如果有任何混淆,请告诉我。我很乐意澄清。