2015-05-13 26 views
2

我一直在试图编写一个bash脚本来记录日志文件中的dmidecode结果。直到现在,这是我得到了多少。如何使用bash记录dmidecode结果

#!/bin/bash 

for i in `seq 0 5`; do 
sudo su <<HERE 
dmidecode -t $i >> system.log 
HERE 

done 

当我执行上面的脚本时,它会询问我的密码。只要我输入密码,就会出现以下错误6次。

bash: line 1: system.log: Permission denied 

有人有任何想法如何解决这个问题并记录dmidecode的细节。任何帮助深表感谢。由于

+0

'ls -l'的结果? – Thronghar

+1

@EtanReisner:重定向不在这里docs扩展,所以我怀疑这个问题在别处;就我所知,OP的脚本应该工作。 – mklement0

+1

@ mklement0好的,很好。我懒得去测试一下以找出答案。这可能意味着该问题只是该文件的“普通”权限问题。 –

回答

3

你的书面应该工作的命令,但是它可以简化为:

#!/bin/bash 

for i in {0..5}; do 
    sudo -s <<<"dmidecode -t $i >> system.log" 
done 

如果以上不工作,让我们知道。

  • sudo -s需要命令从标准执行作为根[1],所以没有必要su;由于该命令足够简单,因此我使用的是这里的字符串<<<)而不是here-document。
    • 注输出重定向,>> system log,怎么是命令字符串部分,因为它本来就在当前用户的上下文中发生:
      • sudo -s <<<"dmidecode -t $i" >> system.log实际产生您描述的错误,如果您在不允许当前用户创建文件的目录中执行该错误。
    • 结果是由此产生的system.log文件归root所有。
  • {0..5}使用大括号扩展来驱动迭代,效率更高。

[1] sudo -s接受命令作为附加参数,但是这样的命令传递这种方式被限制为简单命令重定向,所以它不会在这种情况下工作。
此外,您不能传递像单个字符串这样的命令,该字符串需要单独传递 - 引用 - 它的参数。
旧版本版本的sudo - 例如在macOS上发现的最多10版本。11 - did允许传递整个shell命令行作为单个参数,但不应再使用该参数 - 使用stdin输入。

相关问题