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:[example@unixlinux.online]$ sudo -s [example@unixlinux.online]# ls -hal /root/ > /root/test.out [example@unixlinux.online]# ^D [example@unixlinux.online]$ -
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