geçen dd atlama | onaltılık olarak göreli konum


11
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f

İkinci komut neden farklı bir değer veriyor?

Skip | seek ofsetini ddonaltılı bir değer olarak geçirmek mümkün müdür ?

Yanıtlar:


18

İkinci komut neden farklı bir değer veriyor?

Tarihsel nedenlerden ötürü, çarpma operatörü olarak ddkabul xedilir. Yani 0x30 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, Zve Ysı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 bson eki. (Başka birçok olası son ek vardır. Örneğin, EB"10 18 ile çarp " PiBanlamı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))

$((...))POSIX aritmetik genişleme olduğunu unutmayın , hiç bash spesifik değildir, kullanmak bashiçin kullanmak zorunda değilsiniz , herhangi bir POSIX kabuğu yapacak. Bununla birlikte bash, dahil olmak üzere birçok kabukta , kelime bölünmesine maruz kaldığına dikkat edilmelidir.
Stéphane Chazelas

@StephaneChazelas: Bu doğru, bash'e özgü değil. Ancak, tırnak işareti gerekmez. (Pozix: "İfade, ifadenin içindeki bir çift tırnak özel olarak ele alınmaması dışında çift tırnak içine alınmış gibi ele alınmalıdır.") İfadede bir değişken varsa ve değeri bir ayırıcı içeriyorsa, geçerli bir sayı olmaz; tırnak içine almak $((...))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=4ancak bu her türlü kaosa neden olurdu.
rici

Alıntı yaptığınız bölüm içeride ne olduğu ile ilgili $((...)). 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.
Stéphane Chazelas

@StephaneChazelas: evet, sayısal sonuç kelime bölünmesine tabidir. Ama bu bir tamsayı. IFSRakam 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.
rici

1
@ogurets: hangi kabuğu kullanıyorsunuz? (Lütfen sürümü ekleyin).
rici

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.