Váš příkaz nefunguje, protože přesměrování provádí váš shell, který nemá oprávnění zapisovat do /root/test.out . Přesměrování výstupu není provádí sudo.
Existuje několik řešení:
-  Spusťte shell pomocí sudo a zadejte mu příkaz pomocí -cmožnost:sudo sh -c 'ls -hal /root/ > /root/test.out'
-  Vytvořte skript pomocí svých příkazů a spusťte jej pomocí sudo: #!/bin/sh ls -hal /root/ > /root/test.outSpusťte sudo ls.sh. Pokud nechcete vytvořit dočasný soubor, přečtěte si odpověď Steva Bennetta.
-  Spusťte shell pomocí sudo -spak spusťte své příkazy:[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-  Použijte sudo tee(pokud při použití-cmusíte hodně escapovat možnost):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/nullPřesměrování na /dev/nullje potřeba k zastavení tee z výstupu na obrazovku. Chcete-li připojit místo přepsání výstupního souboru (>>), použijtetee -anebotee --append(poslední je specifický pro GNU coreutils).
Díky patří Jd, Adamu J. Forsterovi a Johnathanovi za druhé, třetí a čtvrté řešení.
Někdo tady právě navrhl sudo tee:
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
To lze také použít k přesměrování libovolného příkazu do adresáře, ke kterému nemáte přístup. Funguje to proto, že tee program je ve skutečnosti program "echo do souboru" a přesměrování na /dev/null má zastavit jeho výstup na obrazovku, aby zůstal stejný jako původní vytvořený příklad výše.
Trik, na který jsem sám přišel, byl
sudo ls -hal /root/ | sudo dd of=/root/test.out