Yanıtlar:
İkinci komut neden farklı bir değer veriyor?
Tarihsel nedenlerden ötürü, çarpma operatörü olarak dd
kabul x
edilir. Yani 0x3
0 olarak değerlendirilir.
Skip | seek ofsetini onaltılık bir değer olarak dd'ye geçirmek mümkün müdür?
Bildiğim kadarıyla doğrudan değil. İşleci kullanarak çarpmanın yanı sıra x
, herhangi bir sayıya b
"512 ile çarp" (0x200) ve K
"çarparak 1024 ile çarp" (0x400) anlamına gelir. GNU da ekleri kullanabilir dd ile M
, G
, T
, P
, E
, Z
ve Y
sırasıyla 20 güç, 30, 40, 50, 60, 70, 80 ya da 90, için 2 ile çarpın anlamına ve üst kullanabilir veya başka durumda düşürebilir için b
son eki. (Başka birçok olası son ek vardır. Örneğin, EB
"10 18 ile çarp " PiB
anlamına gelir ve "2 50 ile çarp " anlamına gelir . info coreutils "block size"
GNU kurulumunuz varsa daha fazla bilgi için bakın .)
Yukarıdaki gizemli, anakronistik ve saçma noktaya kadar geeky bulabilirsiniz. Endişelenmeyin: yalnız değilsiniz. Neyse ki, hepsini görmezden gelebilir ve kabuğunuzun aritmetik ikamesini kullanabilirsiniz (bash ve diğer Posix uyumlu kabuklar ve bazı Posix olmayan kabuklar çalışacaktır). Kabuk onaltılık sayıları anlar ve normal şekilde yazılan bir dizi aritmetik işleçe izin verir. İfadeyi şu şekilde kuşatmanız yeterlidir $((...))
:
# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
$((...))
hiçbir şey değişmez. Alıntıların nerede bir şey yapacağını düşünebileceğim tek durum, böyle bir şeye sahip olmanızdı, IFS=4
ancak bu her türlü kaosa neden olurdu.
$((...))
. POSIX, genişlemesinin $((...))
sözcük bölünmesine tabi olduğu açıktır . Komut / aritmetik / değişken genişletmelerinden herhangi birini liste bağlamında belirtilmemiş bırakmak split + glob operatörüdür. Split + glob operatörünü gerekmediği / istenmediği yerlerde kullanmazsanız IFS = 4'ü ayarlamak her türlü soruna neden olmaz ve bu split + glob operatörüne her ihtiyacınız olduğunda IFS'yi ayarlayın.
IFS
Rakam içeren bir şeye, şimdiye kadar yaptığıma inanmadığım bir şeye ayarlarsanız , o zaman alıntı yapmanız gerekir. Muhtemelen, eğer biri bunu yapıyor olsaydı, ihtiyacın farkında olurdu, çünkü raslantısal olarak yapılması muhtemel bir şey değildir. Ya da en azından, bunu yapmam pek mümkün değil, nokta. Senin için konuşmak istemiyorum.
Bu eski bir iş parçacığı olduğunu biliyorum, ama benim gibi aptallar gitmeden ve yanlışlıkla bir 'cp fileA fileB' geri bas ve henüz geri gitmez git teslim up ve tüm bir nighter sonra birkaç saat kodlama içeren: - /
Bu konudaki kavramlar sayesinde kayıp dosyamı tamamen kurtarabildim, ancak 32Gb disk ve çok az RAM (Ubuntu 18.04 çalıştıran) ile uzak bir Sanal Özel Sunucuda mayın kaybettim ve 'grep' kullanarak tüm girişimlerimi yukarıdaki 'yetersiz bellek' ile çabucak ölecekti
Benim durumumda hexdump -C /dev/sdX1 | grep 'shortString'
kurtarmaya geldi. Grep'in aksine, sadece hex'in çok narroy bir ASCII temsilini görüntüler, bu yüzden sadece kısa bir benzersiz dize aramak ve bunun bile sarılabileceğini akılda tutmak önemlidir. Bir eşleşme olan bazı hex adresleri çıkardıktan sonra, 'dd'yi yukarıdaki gibi benzer bir şekilde kullanabildim, ancak 4096 blok boyutuna varsayılan gibi göründüğünü fark ettim, bu yüzden sadece onaltılık bayt adresini ondalığa dönüştürün, ancak dd'nin atlama parametresi için 4k bloklara ölçeklemek için 4096'ya bölün - yararsız bir şekilde, bu sayı dd için çok büyükse, hata mesajı skip=
, kendisine iletilen sayı yerine geçersiz olmaktan şikayet ediyor gibi görünüyor .
Bash ile $((0xabcd))
easilty obtaion hex-> dec dönüşüm için kullanma hakkında ipuçları ekledi millet için Kudos :-)
Sadece son sözüm - Benim durumumda, aynı dosyanın birkaç yakın kopyası vardı. Ancak en düşük adresi hexdump I tarafından bildirilen en yüksek adresten çıkarmak, mümkün olan tüm kopyaları içeren ~ 5MB'lik bir bölgeyi tanımlayabildi, bu da dd'yi en düşük adrese hedefleyebileceğim ve tüm bölgeyi geçici bir dosyaya çıkarabileceğim anlamına geliyordu. Vim editörü artık ikili içeriği oldukça zarif bir şekilde işliyor, böylece geçici dosyayı inceleyebilir ve gerektiği gibi yeniden şekillendirebilirsiniz.
$((...))
POSIX aritmetik genişleme olduğunu unutmayın , hiç bash spesifik değildir, kullanmakbash
için kullanmak zorunda değilsiniz , herhangi bir POSIX kabuğu yapacak. Bununla birliktebash
, dahil olmak üzere birçok kabukta , kelime bölünmesine maruz kaldığına dikkat edilmelidir.