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í
-c
mož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.out
Spusťte
sudo ls.sh
. Pokud nechcete vytvořit dočasný soubor, přečtěte si odpověď Steva Bennetta. -
Spusťte shell pomocí
sudo -s
pak 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í-c
musíte hodně escapovat možnost):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Přesměrování na
/dev/null
je 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 -a
nebotee --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