AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 436013
Accepted
spaceman117X
spaceman117X
Asked: 2018-04-07 08:25:24 +0800 CST2018-04-07 08:25:24 +0800 CST 2018-04-07 08:25:24 +0800 CST

ssh 以用户身份登录并更改为 root,无需 sudo

  • 772

我有以下任务:

  • 该命令必须通过 ssh 在 bash 脚本中以 root 身份在服务器上远程运行,并且必须在变量中获取命令输出。
  • 以 root 身份登录 ssh 被禁用。
  • 服务器上的 sudo 被禁用,所以我必须使用 su。
  • 编辑:因为我想在 bash 中使其尽可能自动化,所以密码必须存储在命令中

我已经用谷歌搜索了好几天,但似乎找不到解决方案。

此处提出的解决方案:ssh to server and switch user and change a directory

    ssh -t username@hostname "sudo su - otheruser -c \"cd /path/to/directory && command\""

不起作用,因为在服务器上禁用了 sudo:

有人对此有解决方案吗?

ssh su
  • 6 6 个回答
  • 45788 Views

6 个回答

  • Voted
  1. Giraffer
    2018-04-07T08:30:31+08:002018-04-07T08:30:31+08:00

    通过 SSH 登录(作为非特权用户),然后运行su不带任何参数的命令以更改为 root 用户。您将需要 root 密码才能执行此操作。然后运行您想要运行的任何命令。
    编辑:如果您想在一行中执行此操作,可以使用以下方法:
    ssh username@hostname "su -c \"code_here\""
    如果这不起作用,请确保通过以 root 身份运行来启用 root 密码passwd。这将要求您输入新的 root 密码。
    额外:以除 root 以外的其他用户身份运行命令(请注意,这需要目标用户的密码):
    ssh username@hostname "su - username_of_target -c \"code_here\""

    • 4
  2. Best Answer
    Jeroen
    2018-04-09T23:30:55+08:002018-04-09T23:30:55+08:00

    也许有点离题,但这可以通过 Python 和paramiko模块来实现:

    #!/usr/bin/python2
    import time
    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('127.0.0.1', port=22, username='user', password='pass')
    
    stdin, stdout, stderr = ssh.exec_command('su')
    time.sleep(0.1) # some enviroment maybe need this.
    stdin.write('root_password_goes_here\n')
    
    [ add extra code here to execute a command ]
    
    stdin.flush()
    print (stdout.readlines())
    ssh.close()
    

    应该注意的是,从安全角度来看,将密码存储在脚本中通常是一个坏主意。确保您为脚本设置了适当的权限(例如 chmod 740)

    • 4
  3. Chetan Kolhe
    2018-12-29T02:39:57+08:002018-12-29T02:39:57+08:00

    您还可以使用 paramiko 调用 shell 命令进行交互式会话。 https://www.youtube.com/watch?v=lLKdxIu3-A4

    import paramiko
    from paramiko.channel import Channel
    import time
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('ip', port=22, username='non-root', password='non-root-password')
    
    channel:Channel = ssh.invoke_shell()
    print(type(channel))
    channel_data = str()
    
    while True:
       if channel.recv_ready():
           time.sleep(2)
           channel_data += str(channel.recv(999))
       else:
           continue
    
       channel.send("whoami\n")
       time.sleep(2)
       channel_data += str(channel.recv(999))
    
       channel.send("su\n")
       time.sleep(5)
       channel_data += str(channel.recv(999))
    
       # if "Password" in channel_data:
       channel.send("rootpaasword\n")
       time.sleep(2)
       channel_data += str(channel.recv(999))
    
       channel.send("whoami\n")
       time.sleep(2)
       channel_data += str(channel.recv(999))
    
       # channel_data += str(channel.recv(999))
       break
    
    
    print(channel_data)
    
    • 3
  4. Chris
    2019-01-31T01:53:07+08:002019-01-31T01:53:07+08:00

    与将 root 密码放在脚本中相比,安全噩梦要少一些,您可以使用setuid可执行文件。

    setuid可执行文件以 root 身份运行,无论哪个用户执行它们。

    这样做的主要优点是,如果有人偷了你的笔记本电脑,他们可以smartctl -a /dev/sda以 root 身份运行,否则只有你的用户权限。甚至更少,如果您使用稍后提到的强制命令设置公钥。

    编写一个简单的 C 程序,smartctl_wrapper.c简单地运行您需要的脚本或程序,如下所示:

    #include <unistd.h>
    
    int main() {
        //depending on your use case, you may want 
        //setuid(0), setgid(0), and/or setegid(0) here
        execl("/full/path/to/smartctl","smartctl","-a","/dev/sda",(char*) NULL);
    }
    

    并将其编译为gcc smartctl_wrapper.c -o smartctl_wrapper.

    然后,您使其属于 root 以及应该能够运行它的组。这些命令应该以 root 身份运行:

    chown root:some_group smartctl_wrapper
    

    然后使其成为setuid可执行文件。还要防止任何用户对其进行编辑:

    chmod 4510 smartctl_wrapper
    

    现在这是一个可执行文件,可以由some_group具有 root 权限的任何成员运行,而无需任何密码。

    现在您可以简单地使用 ssh 运行它:

    ssh [email protected] /path/to/smartctl_wrapper
    

    如果服务器允许,您可以使用公钥设置 ssh 连接,以允许无需密码的连接。您还可以使用强制命令,这样除了运行这个脚本之外,这个键对任何事情都没有好处。

    如果服务器不允许,您可以创建一个包含 ssh 密码的脚本。在这种情况下,我强烈建议您为此创建一个具有最小权限和登录 shell 的新用户/sbin/nologin。

    或者,对于您的特定用例,避免完全以 root 身份运行命令可能更有意义ssh。例如,您可以使用cron. 您可以使用以下命令编辑 root 的 crontab:

    su -c crontab -e -u root
    

    并添加以下行:

    5 0 * * sun smartctl -a /dev/sda >> /some/path/to/log/some/non/root/user/can/read
    

    给定的行将在周日午夜后 5 分钟每周运行一次命令。您可以按照crontab(5)中的说明根据自己的喜好进行调整。

    然后,您可以使用ssh仅阅读日志。

    • 2
  5. spaceman117X
    2018-04-10T06:06:32+08:002018-04-10T06:06:32+08:00

    所以,经过 4 个小时的额外网络爬取,我终于成功了!非常感谢@jeroen-it-nerdbox 给了我对此的见解:

    任务是从 smartctl(需要 root 凭据)、禁用 ssh-root 和禁用 sudo 的服务器获取数据。这当然也适用于 sudo 而不是 su。

    这是带有 Paramiko 实现的 Python 中完整的可用代码。

    #!/usr/bin/python2
    
    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('rootserver.domain.com', port=22, username='admin', password='adminpass')
    
    stdin, stdout, stderr = ssh.exec_command('/bin/su root -c "smartctl -a /dev/sda > /tmp/smartctl_output"', get_pty=True)
    stdin.write('rootpass\n')
    
    stdin.flush()
    print (stdout.readlines())
    ssh.close()
    
    • 1
  6. Christophe Casalegno
    2019-08-07T15:33:19+08:002019-08-07T15:33:19+08:00

    您可以在 bash 中像这样简单地执行此操作:模拟人类与 su 的交互。我在没有 sudo 的服务器的自动远程安装程序上使用它。

    sucmd="sh -c 'sleep 3; echo $pass' | script -qc 'su -c ./yourscript.sh root '"
    
    ssh -t -l "$user" "$ipaddress" -p 22 "$sucmd"
    

    亲切的问候,

    • 0

相关问题

  • Auto-SSH 手动工作,但不在后台工作

  • 远程运行 X 应用程序,在远程主机上运行 GUI [关闭]

  • rsync 端口 22 和 873 使用

  • SCP突然中止:管道损坏,消息验证码不正确

  • 以其他用户身份运行单个命令;sudo 的限制

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve