]> git.saurik.com Git - apt.git/commitdiff
try to detect sudo spawned root-shell in prefixing
authorDavid Kalnischkies <david@kalnischkies.de>
Sun, 29 May 2016 20:09:51 +0000 (22:09 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Sun, 29 May 2016 20:31:43 +0000 (22:31 +0200)
It is a try as the we need to inspect SUDO_COMMAND which could be
anything – apt, apt-get, in /usr/bin, in a $DPKG_ROOT "chroot", build
from source, aliases, …

The best we can do is look if the SHELL variable is equal to the
SUDO_COMMAND which would mean a shell was invoked. That isn't fail-safe
if different shells are involved as sub-shells have the tendency of not
overriding the SHELL so a bash started from within zsh can happily
pretend to be still zsh, so we could have a look at /etc/shells for a
list, but oh well, we have to stop somewhere I guess.
This sudo-prefixing feature is a gimmick after all.

Closes: 825742
apt-private/private-install.cc

index 7bd9a603449dd99b856aa10bda3c2dce97454e8a..63e7b734d65bc313f7287df7dddfbffa88243e88 100644 (file)
@@ -521,8 +521,13 @@ bool DoAutomaticRemove(CacheFile &Cache)
         ioprintf(c1out, P_("%lu package was automatically installed and is no longer required.\n",
                  "%lu packages were automatically installed and are no longer required.\n", autoRemoveCount), autoRemoveCount);
       std::string autocmd = "apt autoremove";
         ioprintf(c1out, P_("%lu package was automatically installed and is no longer required.\n",
                  "%lu packages were automatically installed and are no longer required.\n", autoRemoveCount), autoRemoveCount);
       std::string autocmd = "apt autoremove";
-      if (getenv("SUDO_USER") != NULL)
-        autocmd = "sudo " + autocmd;
+      if (getenv("SUDO_USER") != nullptr)
+      {
+        auto const envsudocmd = getenv("SUDO_COMMAND");
+        auto const envshell = getenv("SHELL");
+        if (envsudocmd == nullptr || envshell == nullptr || strcmp(envsudocmd, envshell) != 0)
+           autocmd = "sudo " + autocmd;
+      }
       ioprintf(c1out, P_("Use '%s' to remove it.", "Use '%s' to remove them.", autoRemoveCount), autocmd.c_str());
       c1out << std::endl;
    }
       ioprintf(c1out, P_("Use '%s' to remove it.", "Use '%s' to remove them.", autoRemoveCount), autocmd.c_str());
       c1out << std::endl;
    }