使用 Sudo 从 SSH 下载文件

Downloading a File from SSH with Sudo

我正在尝试从可从 ssh 访问的远程服务器检索文件 file.txt,并将其内容复制到本地文件。但是我希望这个过程在 .sh 文件中完成。

问题是因为 file.txt 只能从 root 访问,这意味着为了手动查看文件的内容,我必须 运行:sudo cat file.txt ,并通过终端输入我的密码。因此 scp 之类的命令将无法完成工作,因为它们会抛出 Permission Denied 错误。

为了绕过这个,我做了以下操作。

ssh -t user@remote 'sudo cat file.txt'

然而,在bash文件中我打算将结果保存在一个变量中,如下所示:

CONTENT=$(ssh -t user@remote 'sudo cat file.txt')

询问我的密码后,将文件内容存储在变量 CONTENT 中。

如果用户输入他们的密码并按下回车键,这个变量就会被 file.txt 的内容填充;但是终端中不再打印密码界面。这意味着 运行 创建此 bash 文件的人看不到以下行:

[sudo] password for user:

或者密码输入错误时出现下面一行

Sorry, try again.
[sudo] password for user:

更糟糕的是,有时密码的前几个字符实际上会被输入终端!

有办法解决这个问题吗?有没有办法让用户真正看到密码界面?

有意思的是,在变量CONTENT中可以看到[sudo] password for user:Sorry, try again.行,所以不仅密码界面消失了,还污染了变量CONTENT.然而,这不是问题,因为我们可以简单地解析 CONTENT.

我投入了一些研究和努力,实际上它达到了我的期望(希望你也是)。

我把你的 file.txt 当作一个单行文件,因为变量 CONTENT 只存储一行输出。

$ cat file.txt
lorem ipsum dolor sit amet

一行:

$ CONTENT=$(expect -c 'spawn ssh -t user@localhost "sudo cat /tmp/file.txt"; expect "password"; send "userpassword\r"; expect "password"; send "userpassword\r"; interact' | sed -n '4p')

这是我得到的

$ echo $CONTENT
lorem ipsum dolor sit amet

请注意,userpassword 将替换为您输入的密码。

非单行

    $ CONTENT=$(expect -c 
       'spawn ssh -t user@localhost "sudo cat /tmp/deneme.txt";
        expect "password"; send "userpassword\r";       #for first prompt of remote connection.
        expect "password"; send "userpassword\r";       #for second prompt of sudo.
        interact' | sed -n '4p')                        #4th line displayed in the terminal is the file content.

您还可以在终端中看到没有 CONTENTsed 部分的实际输出;

$ expect -c 'spawn ssh -t user@localhost "sudo cat /tmp/file.txt"; expect "password"; send "userpassword\r"; expect "password"; send "userpassword\r"; interact'
spawn ssh -t user@localhost sudo cat /tmp/file.txt
user@localhost's password: 
[sudo] password for user: 
lorem ipsum dolor sit amet
Connection to localhost closed.

关于expect -c 'spawn command; expect; send; interact'的用法,我参考了这个posthttps://unix.stackexchange.com/a/252782/434132

另请注意,我在我的 local host 上而不是 remote host 上在用户之间工作,所以我不知道它是否会产生不同的结果。

这是否回答了您的问题?