【问题标题】:Downloading a File from SSH with Sudo使用 Sudo 从 SSH 下载文件
【发布时间】:2021-09-14 17:36:54
【问题描述】:

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

问题源于file.txt 只能从根访问,这意味着为了手动查看文件的内容,我必须运行: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:

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

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

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

【问题讨论】:

  • 试试ssh -tssh -tt
  • 这个问题与软件开发有关吗?
  • ssh -tt 无法解决问题。我已经试过了。 @乔丹
  • @Cyrus 是的!细节与问题无关,但我试图自动化一个过程,开发人员必须手动复制粘贴来自 ssh 的多个文件的内容。 bash 文件应该自动执行此操作并相应地解析信息。

标签: bash ssh root


【解决方案1】:

我在其中进行了一些研究和努力,并且实际上达到了我的期望(希望你也是)。

我将您的 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'的用法我参考了这篇帖子https://unix.stackexchange.com/a/252782/434132

另外请注意,我在local host 上而不是remote host 上的用户之间工作,所以我不知道它是否会导致不同的方式。

这能回答你的问题吗?

【讨论】:

  • 哇,这太棒了!它确实按预期工作。唯一的问题是将密码放入不安全的命令中。所以我猜密码必须用作 bash 文件的参数(这也是不安全的)。但可能有办法以安全的方式传递密码
  • 很高兴您从中受益。正如您所提到的,问题发生在我们将输出传递给变量的地方。这会终止手动输入密码的提示,我只能通过事先发送密码来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2016-03-28
  • 2021-10-25
  • 2011-01-11
  • 1970-01-01
  • 2012-03-14
  • 2011-11-23
相关资源
最近更新 更多