当 sudo 提示输入密码时将复制粘贴输入锁定到终端

当 sudo 提示输入密码时将复制粘贴输入锁定到终端

总结

当 sudo 提示输入密码时,您可以将复制粘贴输入锁定到终端吗?

更多信息

有时,您想将一长串命令复制并粘贴到终端中,并让它们按顺序运行。如果sudo是任何命令的一部分,则会阻止该命令运行。

例如,使用其网站上提供的终端命令安装 Spotify:

# 1. Add the Spotify repository signing key to be able to verify downloaded packages
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886

# 2. Add the Spotify repository
echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list

# 3. Update list of available packages
sudo apt-get update

# 4. Install Spotify
sudo apt-get install spotify-client

将其复制粘贴到终端将产生以下结果:

user:~$ # 1. Add the Spotify repository signing key to be able to verify downloaded packages
user:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
[sudo] password for user: 
Sorry, try again.
[sudo] password for user: 

所发生的情况是,终端将行“# 2. 添加 Spotify 存储库”解释为提供的密码(或者甚至可能将“”解释为密码,因为 sudo 命令和该行之间有一个换行符),在复制粘贴仍在输入到终端时锁定几秒钟,然后再次解锁以第二次尝试输入密码。

如果您有很多想要连续运行的命令,那么这种情况就很糟糕,因为一些非 sudo 命令将会运行,而 sudo 命令会被拒绝。

解决此问题的快速方法是先手动编写一个无意义的命令,例如$ sudo whatever,然后输入密码,然后粘贴命令系列,如下所示:

user:~$ sudo whatever
[sudo] password for user: 
sudo: whatever: command not found
user:~$ # 1. Add the Spotify repository signing key to be able to verify downloaded packages
user:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
Executing: /tmp/tmp.JQ3ntmdbnL/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80 
--recv-keys
BBEBDCB318AD50EC6865090613B00F1FD2C19886
...
...
...

这是可行的,因为终端实例不会再次提示输入密码。

有没有更聪明的方法来做到这一点?您可以锁定复制粘贴输入,直到提供有效密码吗?

答案1

是的,有很多简单的方法可以做到这一点。

首先,如果你只想获取后续命令的 sudo 权限,则可以使用sudo -v而不是sudo whatever。它会缓存你的凭据而无需运行命令。


假设你想将其复制粘贴到终端:

sudo echo 1
echo 2
echo 3

通常情况下会发生这种情况:

$ sudo echo 1
[sudo] password for wja: 
Sorry, try again.
[sudo] password for wja: 
1

相反,你可以使用大括号

$ {
> sudo echo 1
> echo 2
> echo 3
> }
[sudo] password for wja: 
1
2
3

或者你可以使用用这里的字符串进行 bash

$ bash << EOF
> sudo echo 1
> echo 2
> echo 3
> EOF
[sudo] password for wja: 
1
2
3

或者(这可能是不受信任输入的最佳选择)你可以使用 Bash打开编辑器然后将您的代码片段粘贴到其中。默认快捷键是Ctrl- x, Ctrl- e。将您的输入粘贴到编辑器中,查看它,然后关闭并保存以运行它。

相关内容