将在shell脚本中的命令行上输入的密码保留在bash历史记录之外

将在shell脚本中的命令行上输入的密码保留在bash历史记录之外,bash,shell,security,passwords,password-protection,Bash,Shell,Security,Passwords,Password Protection,我有一个脚本,可以自动为SFTP创建用户帐户。脚本依靠echo将密码回显到chpasswd ala中: echo <username>:<the password> | sudo chpasswd echo:| sudo chpasswd …和openssl来检查生成的加密密码,以确保密码设置正确: openssl passwd -1 -salt <salt> <the password> opensslpasswd-1-salt 由于脚

我有一个脚本,可以自动为SFTP创建用户帐户。脚本依靠echo将密码回显到chpasswd ala中:

echo <username>:<the password> | sudo chpasswd
echo:| sudo chpasswd
…和openssl来检查生成的加密密码,以确保密码设置正确:

openssl passwd -1 -salt <salt> <the password> 
opensslpasswd-1-salt
由于脚本直接在命令行上打印密码,因此我担心这会出现在bash历史记录和/或其他不安全区域中

我已考虑添加以下内容:

HISTIGNORE="echo" echo <username>:<the password> | sudo chpasswd
HISTIGNORE=“echo”echo:| sudo chpasswd
这会可靠地将密码保留在历史记录之外吗?

根据变量的不同,您可以通过在命令前面加空格来防止命令存储在历史记录中:

$ echo $HISTCONTROL

$ echo my password is foo
my password is foo
$  echo my password is bar
my password is bar
$ history | tail -3
  497  echo my password is foo
  498   echo my password is bar
  499  history | tail -3
在第二个示例中,以空格为前缀的命令不会显示在历史记录中


您可以使用
history-d number
从历史记录中删除条目。

根据变量的不同,您可以通过在命令前面加空格来防止命令存储在历史记录中:

$ echo $HISTCONTROL

$ echo my password is foo
my password is foo
$  echo my password is bar
my password is bar
$ history | tail -3
  497  echo my password is foo
  498   echo my password is bar
  499  history | tail -3
在第二个示例中,以空格为前缀的命令不会显示在历史记录中


您可以使用
history-d number
从历史记录中删除条目。

根据变量的不同,您可以通过在命令前面加空格来防止命令存储在历史记录中:

$ echo $HISTCONTROL

$ echo my password is foo
my password is foo
$  echo my password is bar
my password is bar
$ history | tail -3
  497  echo my password is foo
  498   echo my password is bar
  499  history | tail -3
在第二个示例中,以空格为前缀的命令不会显示在历史记录中


您可以使用
history-d number
从历史记录中删除条目。

根据变量的不同,您可以通过在命令前面加空格来防止命令存储在历史记录中:

$ echo $HISTCONTROL

$ echo my password is foo
my password is foo
$  echo my password is bar
my password is bar
$ history | tail -3
  497  echo my password is foo
  498   echo my password is bar
  499  history | tail -3
在第二个示例中,以空格为前缀的命令不会显示在历史记录中


您可以使用
history-d number
从历史记录中删除条目。

脚本中的命令不会出现在您的历史记录中。仅在提示时键入命令

因此,如果您使用
ruby script.rb
调用您的脚本,并且您的ruby脚本执行了许多shell命令,那么这些命令不会出现在历史记录中,只有对
ruby script.rb
的调用才会出现

根据我对标准bash函数的理解,并通过
irb
执行一些简单的命令,我们可以看到bash不是ruby调用的shell,历史变量或命令都不存在:

irb(main):002:0> puts `echo $0`
sh
=> nil
irb(main):003:0> puts `echo $HISTFILE`

=> nil
irb(main):004:0> puts `history`
Errno::ENOENT: No such file or directory - history
        from (irb):4:in ``'
        from (irb):4
        from /usr/bin/irb:12:in `<main>'
irb(main):005:0> 
irb(main):002:0>放入'echo$0`
嘘
=>零
irb(主):003:0>放入'echo$HISTFILE`
=>零
irb(主):004:0>puts`历史`
Errno::eNote:没有这样的文件或目录-历史记录
from(irb):4:in``'
来自(irb):4
from/usr/bin/irb:12:in`'
irb(主要):005:0>
我唯一知道您描述的问题是使用
expect
执行命令时出现的问题。在这种情况下,直接向终端键入命令,并在历史记录中结束。删除这些命令的一个巧妙方法是使用
history-c
,它将清除该会话中的所有条目。

脚本中的命令不会出现在您的历史记录中。仅在提示时键入命令

因此,如果您使用
ruby script.rb
调用您的脚本,并且您的ruby脚本执行了许多shell命令,那么这些命令不会出现在历史记录中,只有对
ruby script.rb
的调用才会出现

根据我对标准bash函数的理解,并通过
irb
执行一些简单的命令,我们可以看到bash不是ruby调用的shell,历史变量或命令都不存在:

irb(main):002:0> puts `echo $0`
sh
=> nil
irb(main):003:0> puts `echo $HISTFILE`

=> nil
irb(main):004:0> puts `history`
Errno::ENOENT: No such file or directory - history
        from (irb):4:in ``'
        from (irb):4
        from /usr/bin/irb:12:in `<main>'
irb(main):005:0> 
irb(main):002:0>放入'echo$0`
嘘
=>零
irb(主):003:0>放入'echo$HISTFILE`
=>零
irb(主):004:0>puts`历史`
Errno::eNote:没有这样的文件或目录-历史记录
from(irb):4:in``'
来自(irb):4
from/usr/bin/irb:12:in`'
irb(主要):005:0>
我唯一知道您描述的问题是使用
expect
执行命令时出现的问题。在这种情况下,直接向终端键入命令,并在历史记录中结束。删除这些命令的一个巧妙方法是使用
history-c
,它将清除该会话中的所有条目。

脚本中的命令不会出现在您的历史记录中。仅在提示时键入命令

因此,如果您使用
ruby script.rb
调用您的脚本,并且您的ruby脚本执行了许多shell命令,那么这些命令不会出现在历史记录中,只有对
ruby script.rb
的调用才会出现

根据我对标准bash函数的理解,并通过
irb
执行一些简单的命令,我们可以看到bash不是ruby调用的shell,历史变量或命令都不存在:

irb(main):002:0> puts `echo $0`
sh
=> nil
irb(main):003:0> puts `echo $HISTFILE`

=> nil
irb(main):004:0> puts `history`
Errno::ENOENT: No such file or directory - history
        from (irb):4:in ``'
        from (irb):4
        from /usr/bin/irb:12:in `<main>'
irb(main):005:0> 
irb(main):002:0>放入'echo$0`
嘘
=>零
irb(主):003:0>放入'echo$HISTFILE`
=>零
irb(主):004:0>puts`历史`
Errno::eNote:没有这样的文件或目录-历史记录
from(irb):4:in``'
来自(irb):4
from/usr/bin/irb:12:in`'
irb(主要):005:0>
我唯一知道您描述的问题是使用
expect
执行命令时出现的问题。在这种情况下,直接向终端键入命令,并在历史记录中结束。删除这些命令的一个巧妙方法是使用
history-c
,它将清除该会话中的所有条目。

脚本中的命令不会出现在您的历史记录中。仅在提示时键入命令

因此,如果您使用
ruby script.rb
调用您的脚本,并且您的ruby脚本执行了许多shell命令,那么这些命令不会出现在历史记录中,只有对
ruby script.rb
的调用才会出现

根据我对标准bash函数
history
的理解,并通过
irb
执行一些简单的命令,我们可以看到bash并不是ruby调用的shell