今天我一直在为我们的最小服务器编写一个小脚本,我可以在其中登录我们的库存软件,下载 csv 并定期使用 cron 作业将其放入 Web 目录中。
使用 script 和 scriptreplay,我能够完美地完成所有这些工作,直到我意识到 scriptreplay 实际上是重播终端输出,而不是我第一次使用 w3m 加载的实际网站。
因此,我正在寻找一种通过 ssh 记录击键的方法,以便遵循我最初的指示。
有人有什么想法吗?如果失败的话,有人有其他选择吗?我们的服务器运行的只是 Ubuntu 的迷你版本,所以没有 GUI。
答案1
所以经过多次来回迦勒我们终于找到了解决问题的方法。我试图直接登录库存管理软件,这很麻烦,但根据我们今晚的来回对话,这解决了这个问题。根本不需要记录击键。只是很好的老头用法。
脚本中的第一个连接是登录并在 cookie 中创建会话:
curl -s -c cookiejar.txt -b cookiejar.txt -L -d '[email protected]&pass=******' -e 'https://my.channelgrabber.com/login.php' https://my.channelgrabber.com/login.php -o /dev/null
接下来,您可以请求另一个页面,但您必须跳过您所在的上一个页面。例如,在上述之后,您可以运行:
curl -s -c cookiejar.txt -b cookiejar.txt -L -e 'https://my.channelgrabber.com/index.php' https://my.channelgrabber.com/products.php -o products.html
这样做完美地实现了我所需要的。从这里开始,我在使用 cookie 后将其删除并检索了我需要的内容:
rm -rf cookiejar.txt
...并将其设置为每 5 分钟运行一次的 cron 作业。关于完整功能,我做了一些额外的行,但这就是为我解决了所有问题的地方。这是大量的尝试和错误。再次非常感谢迦勒谁帮助我完成了这整件事。
答案2
记录命令并重放它们是解决这个问题的错误方法。相反,您应该编写一个脚本来处理这项工作。 Shell 脚本基本上只是命令列表,就像您在命令行上运行以便执行它们一样。在编辑器中启动一个新的黑色纯文本文件,并在第一行输入您希望其运行的 shell。例如,这应该是一个好的开始:
#/usr/bin/env bash
现在用诸如 之类的名称保存它fetch_and_post_logs.bash
。请注意,这应该是可以找到它的地方cron
,/usr/local/bin/
可能是一个不错的选择。
接下来,将脚本设置为可执行:
$ chmod 755 /usr/local/bin/fetch_and_post_logs.bash
现在让这个脚本变得更具体一些。对于这一部分,您必须自己提供一些知识,但假设您首先将某些内容从远程服务器复制到本地文件夹:
#/usr/bin/env bash
timestamp=$(date +%Y-%m-%d)
scp user@remotehost:/path/to/logs.csv /path/to/www/logs-${timestamp}.csv
然后从 cron 运行此脚本:
0 0 * * * /usr/local/bin/fetch_and_post_logs.bash
这应该可以帮助您开始。如果您需要更多帮助,请询问有关您遇到困难的地方的具体问题。
请注意,要实现此功能,cron
需要能够以相关用户身份登录而无需密码,因此您需要设置一个仅对日志具有有限访问权限的用户,然后添加一个公钥/私钥参数,以便它可以验证。
答案3
我同意其他人的观点,即您可能有更好的方法来解决您的问题,但我可以看到记录您所做的事情并使用它来稍后制作脚本的一些好处。
要跟踪您的输入,您可以将其tee
传递到文件中,例如:
tee logFile < /dev/stdin | bash
CTRL您可以使用-关闭它D。
答案4
让计算机记录命令并为您编写脚本的开头。这对于TCL, 尤其expect
。
$ autoexpect ssh somesystem
autoexpect started, file is script.exp
Last login: Mon Jan 23 15:14:04 2017 from 84-182-91-4.dyn.example.net
somesystem$ pwd
/home/jdoe
somesystem$ exit
logout
Connection to 192.0.2.42 closed.
autoexpect done, file is script.exp
$ cat script.exp
...
或者常规脚本,这也很容易。
#!/usr/bin/env expect
package require Tcl 8.5
set timestamp [clock format [clock seconds] -format "%Y-%m-%d"]
exec scp user@host:/in/log.csv /out/log-$timestamp.csv
需要与spawn
以下自动化进行交互吗?这就是interact
目的。提示密码?实现自动化没有太大困难expect
。