我最近安装了bash-completion(通过自制程序)。它现在省略了我希望它显示的完成列表中的文件,并完全省略了有效选项,例如:
[alex@mbp foo]$ ls
bar.csv foo.csv
[alex@mbp foo]$ sh ../dosomething.sh fo<TAB>
((nothing shown))
Run Code Online (Sandbox Code Playgroud)
作为一个重度命令行用户,这是非常烦人的。谁能告诉我如何禁用这种行为?我在文档或谷歌中找不到任何有用的东西。
bash-completion FAQ说:
问:bash 完成代码禁止某些命令在我的环境中具有合法扩展名的文件上完成。我是否必须禁用该命令的完成才能完成我需要的文件?
答:不可以。使用 M-/(用 bash 手册页的话说)尝试在光标左侧的文本上完成文件名。这将规避 bash 完成代码设置的任何文件类型限制。
但这对我来说不是一个可以接受的解决方案 - 我希望“TAB”显示所有文件/目录,无论扩展名是否对文件有效(这就是它在过去 20 年中对我来说运作良好的方式)。
我怎样才能实现这个目标?
我更喜欢.bashrc/.bash_profile设置而不是删除全局完成脚本。以下是我目前包含 bash-completion 的方式(这只是一个普通的自制软件安装):
[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
Run Code Online (Sandbox Code Playgroud)
更新:我已经看到了这个Bash 文件名选项卡完成,但它并不完全是我想要的,因为它需要为地球/我的系统上的每个可能的文件扩展名进行太多的手动工作。
我正在尝试运行 rkhunter,但它给了我以下输出:
\n\nstack/security/rkhunter-1.4.6\n\xe2\x9e\x9c sudo rkhunter --check\nPassword:\nInvalid BINDIR configuration option: Invalid \ndirectory found: ~/.dotnet/tools\nInvalid BINDIR configuration option: Invalid \ndirectory found: \nWorkbooks.app/Contents/SharedSupport/path-bin\nRun Code Online (Sandbox Code Playgroud)\n\n如何进入 PATH 变量并从所有 shell 会话中删除这些目录?这些目录都不在我的 .bash_profile 或 .bashrc 中。
\n我想使用heredoc作为模板生成一些内容:
passphrase=$(<passphrase) envsubst <<EOF
apiVersion: v1
kind: Secret
metadata:
name: openshift-passphrase
stringData:
passphrase: ${passphrase}
EOF
Run Code Online (Sandbox Code Playgroud)
并将其通过管道传输到oc create -f -.
如果我在 后面添加管道EOF,则不起作用。
如何通过管道将带有变量替换的定界文档传递给消耗它的东西?
我正在使用 SoftEther VPN 客户端连接到远程计算机。为了通过 ssh 访问远程计算机,我首先必须执行以下步骤:
cd ~/vpnclient
sudo ./vpnclient start
./vpncmd
2 (asked to pick an option)
Enter "" (with no input)
accountconnect
<my_name_1>
exit
sudo dhclient <my_name_2>
Run Code Online (Sandbox Code Playgroud)
之后,我就可以 ssh 了。但每次重新启动时我都必须这样做。
我确信一定有一种方法可以使这一切自动化,但我不知道从哪里开始。我可以编写一个 shell 脚本来执行此操作,即使它运行一个程序,然后在程序中键入内容?或者我应该用Python来做这个?
任何帮助都会很棒。
我正在开发一个存储和检索秘密的计算机程序,并且需要在服务器上无需用户交互的情况下运行。
我已经成功地在系统中设置了所有内容,用于检索缓存的密码短语,而无需用户交互来在指定文件名时gpg-agent加密和解密数据。 gpg2 --symmetric
但是,这需要我将数据暂时存储在磁盘上而不加密。我不想将未加密的数据放在我的磁盘上。所以现在我已经更改了使用 STDIN 和 STDOUT 而不是磁盘文件的内容。
我正在测试的命令是这样的:cat test.txt | gpg2 --symmetric -o test.gpg。
问题是,现在似乎不可能缓存密码,因此我每次都必须以交互方式输入它。这对我的服务器程序不起作用。
我已经尝试使用 gpg-preset-passphrase 来实现此目的。我不知道这是否可能,因为它需要一个“KEYGRIP”。我的一个粗略想法是:也许 gpg2 与 --symmetry 和 STDIN 一起使用一些默认的 keygrip。但我不知道这个想法是否会成功。
我不打算在我的代码中使用 --passphrase 指定密码,因为这意味着我需要在代码中存储秘密,而我不会这样做..并且它将允许任何可以访问代码的人解密文件。它还会在命令行上公开密码。
我希望我想要实现的目标足够清楚。任何想法表示赞赏。
我试图更深入地了解管道和重定向。在每个指南中都说cmd1 | cmd2cmd1 将执行,并且 stdout 将与 cmd2 的 stdin 共享。但这在我看来不太好,所以我测试了它:
所以看起来 ./test.sh和grep 都是并行运行的!
这是源代码:
#!/bin/bash
a=0
while :
do
((a=a+1))
echo "Line number $a"
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
尝试使用不同的推荐会显示相似的结果。 管道是否平行运行?
管道和重定向如何“在幕后”工作?
通常,该time命令输出三行:
> time sleep 2
real 0m2.003s
user 0m0.000s
sys 0m0.006s
Run Code Online (Sandbox Code Playgroud)
然而,当前面加上变量赋值时,输出变成一行:
> VAR="" time sleep 2
0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 2060maxresident)k
0inputs+0outputs (0major+86minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?有没有办法在保持变量赋值的同时将输出分成三行?
我正在 Windows 命令行和 WSL bash 上通过 SSH 连接到虚拟机。但是,每次我通过 SSH 连接到 Windows 10 VM(从我自己的 Windows 10 本地计算机)时,它都会打开默认的 Windows 命令提示符作为 shell。我希望当我在 Windows 命令提示符和 WSL bash(在我的本地计算机上)上使用 SSH 时打开 WSL bash。我的本地机和虚拟机都安装了 WSL。
我尝试过:New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\bash.exe" -PropertyType String -Force在以管理员身份运行的 Windows Powershell 上,但它不起作用。我得到的只是这个,但没有任何改变:
DefaultShell : C:\Windows\System32\bash.exe
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
PSChildName : OpenSSH
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Run Code Online (Sandbox Code Playgroud)
更新:在通过 SSH 连接到 Windows 10 虚拟机后,我可以通过bash.exe从C:\Windows\System32. 但是,当我第一次使用 SSH 时,它仍然作为默认的 Windows 命令行启动。
windows ssh bash virtual-machine windows-subsystem-for-linux
我为 sudo 设置了一个别名:
alias sudo='sudo PATH=$MY_PATH'
Run Code Online (Sandbox Code Playgroud)
我通过运行检查这是否运行良好sudo printenv PATH。
但是,我在运行时遇到错误sudo su - USER2。
sudo:抱歉,您不能设置以下环境变量:PATH
我可以通过运行找到解决方法sudo -i su - USER2,但我想知道为什么会出现此错误。
我提到了https://www.sudo.ws/man/1.8.28/sudoers.man.html#Denied_command_log_entries但无法得到原因。
抱歉,您不能设置以下环境变量
用户在命令行上指定了 sudoers 不允许的环境变量。
为什么仅在使用命令时 sudoers 才会拒绝 PATH su?
任何链接或评论表示赞赏。