linux - 命令不会在脚本中运行

标签 linux shell ssh

我正在尝试在 shell 脚本中运行命令,但它不起作用。

在 shell 中的脚本之外,我可以在所需的主机上运行以下命令。创建的文件中包含正确的信息。

sudo cat /etc/shadow | cut -d: -f1,8 | sed /:$/d > /tmp/expirelist.txt

当命令在我的脚本中运行时,我首先 ssh 结束然后运行命令,但出现以下错误。

[batch@testserver01 bin]$ checkP.sh
Testserver02
/usr/local/bin/checkP.sh: line 7: /tmp/expirelist.txt: Permission denied

这是脚本的一部分。我试过使用 ssh -o

#!/bin/bash

for SERVER in `cat /admin/lists/testlist`
do
  echo $SERVER

  ssh $SERVER sudo cat /etc/shadow | cut -d: -f1,8 | sed /:$/d > /tmp/expirelist.txt
...

导致权限被拒绝错误的原因是什么?

最佳答案

不要使用硬编码的临时文件名——当你这样做时,这意味着如果一个用户(比如你的开发帐户)已经运行了这个脚本并留下了一个名为 /tmp/expirelist.txt 后面,没有其他用户可以运行相同的脚本。

tempfile=$(mktemp -t expirelist.XXXXXX)
ssh "$SERVER" sudo cat /etc/shadow | cut -d: -f1,8 | sed /:$/d >"$tempfile"

通过使用 mktemp,您可以保证每次调用都将使用一个新的、不同的、以前不存在的临时文件,从而防止发生任何冲突。


顺便说一下——如果你想在远程系统而不是本地系统上创建文件,你会想这样做:

ssh "$SERVER" <<'EOF'
tempfile=$(mktemp -t expirelist.XXXXXX)
sudo cat /etc/shadow | cut -d: -f1,8 | sed /:$/d >"$tempfile"
EOF

关于linux - 命令不会在脚本中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27806975/

相关文章:

linux - 使脚本在用户登录时只运行一个实例

mysql - 从 MySQL 数据生成 PDF 并使用 Postfix 发送它,而不使用 PHP?

Linux Shell 脚本 = grep -o -P 'FE=.*? ' 不工作

Linux shell脚本将列读入变量,然后添加属性

c - 如何使用 -lm -pthread 参数在 Netbeans 中编译 C 项目?

python os.path.exists()对于存在的nfs挂载目录文件失败

linux - 使用 hush 运行配置时重定向不明确

php - 如何在CentOS 8下安装phpseclib?

networking - 如何为支持 SSH 的服务器启用 SOCKS

ssh - 将 Visual Studio Code 连接到 Codeanywhere 容器